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 }
posted @ 2012-09-03 22:28  冰鸮  阅读(214)  评论(0编辑  收藏  举报