UVa 10718 - Bit Mask

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1659

题意:给出数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 }

你可能感兴趣的:(bit)