题目链接: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 }

相关文章:

  • 2021-11-11
  • 2021-12-20
  • 2021-05-12
  • 2021-10-05
  • 2021-07-22
  • 2022-01-12
  • 2021-09-09
  • 2021-12-14
猜你喜欢
  • 2021-11-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-23
  • 2021-12-03
相关资源
相似解决方案