UVa 10718 - Bit Mask
题意:给出数N, L, U, 求一个数M, L ≤ M ≤ U,使得 N 与 M 按位或运算的结果最大,求最小的 M。
分析:贪心。从最高位开始枚举,如果 N 的二进制表示形式的第 i 位是0,那么就尽可能让 M 的第 i 位在给定范围内是1。如果 N 的二进制表示形式的第 i 位是1,因为要求最小的M,则 M 的第 i 位要在给定范围内尽可能是0。
1 #include <cstdio> 2 3 int main() 4 { 5 unsigned int N, L, U, M; 6 int i; 7 while ( scanf("%u%u%u", &N, &L, &U) != EOF ) 8 { 9 M = 0; 10 for ( i = 31; i >= 0; i-- ) 11 { 12 M += ( 1 << i ); 13 // printf( "%d\n", M ); 14 if ( M > U ) 15 { 16 M -= ( 1 << i ); 17 continue; 18 } 19 if ( N & ( 1 << i ) ) 20 { 21 if ( M >= L ) 22 { 23 M -= ( 1 << i ); 24 } 25 } 26 // printf( "%u\n", M ); 27 } 28 if ( M < L ) M += 1; 29 printf( "%u\n", M ); 30 } 31 return 0; 32 }