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 }

转载于:https://www.cnblogs.com/GBRgbr/archive/2012/09/03/2669689.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值