UVA 12444 Bits and Piecest
http://uva.onlinejudge.org/external/124/12444.html
Este problema a simple vista parece difícil, pero al analizar un poco como se comporta los operadores binarios de AND y OR, nos damos cuenta que siempre debe tener los dos números, tanto A como B, los mismo bits de C, si existiera un bit en C que no estuviera prendido en D entonces hay un error, para encontrar el número cuya diferencia de |B - A| sea mínima, solo hace falta notar que todos los bits que no están C pero si están en D, el bit con valor mas alto se asigna a el valor de B y todos los demás bits se suman a A.
/*
Problem: UVA 12444 Bits and Pieces
Autor: Rodrigo Burgos Dominguez
Problem: Let A and B be non-negative integers and let C = A&B and D = A|B. Given C and D,
can you find A and B such that the absolute difference (|A-B|) is minimal?
Solution: greedy
*/
# include "stdio.h"
# include "string.h"
int transform[2][32];
long long max( long long a, long long b){ return a > b ? a : b; }
long long min( long long a, long long b){ return a < b ? a : b; }
void trans(int indice, long long number){
int pos;
memset( transform[ indice ], 0, sizeof( transform[ indice ]));
for( pos = 0; number > 0 ; pos++){
transform[indice][pos] = (number % 2);
number /= 2;
}
}
main(){
int cases, ncases, notSolution, x;
long long C, D, A, B, pot, last;
for( scanf("%d", &ncases), cases = 1; cases <= ncases ; cases++ ){
scanf("%lld %lld", &C, &D);
trans( 0, C );
trans( 1, D );
notSolution = A = B = last = 0;
for( x = 0, pot = 1; x < 32; x++, pot *= 2){
if( transform[ 0 ][ x ] > 0 && transform[1][x] == 0 ) notSolution = 1;
if( transform[ 0 ][ x ] > 0 ){
A += pot;
B += pot;
}else if( transform[ 1 ][ x ] > 0 ){
A += last;
last = pot;
}
}
B += last;
if( notSolution == 1 ) printf("-1\n");
else printf("%lld %lld\n", min(A,B), max(A,B));
}
return 0;
}
Cualquier duda o sugerencia contactarme a rodrigo.burgos@gmail.com
No hay comentarios:
Publicar un comentario