设为首页 加入收藏

TOP

UVA 10718 Bit Mask 贪心+位运算
2014-11-23 21:54:16 来源: 作者: 【 】 浏览:10
Tags:UVA 10718 Bit Mask 贪心 +位 运算
题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小。
很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚。。。
然后网上翻到了一个人家位运算一句话解决了 = =....ORZ...
人家的分析:(by天然呆大神)
量 N 中 0 的位元,M 1;N 1 的位元, M 0。
因此 高位往低位 查,
如果 N 1(M 量 0),若 M 不能 0, 必是因 M 1 仍小於 L;
如果 N 0(M 量 1),若 M 不能 1, 必是因 M 0 仍大於 U(此 不可能),
句 ,M 1 ,M 需不大於 U。
注意:如果是long long的位运算操作,最好在数后面加个LL,不如会溢出的。
代码:
 /* 
 *   Author:        illuz  
 *   Blog:          http://blog.csdn.net/hcbbt 
 *   File:          uva10718.cpp 
 *   Lauguage:      C/C++ 
 *   Create Date:   2013-09-04 09:26:39 
 *   Descripton:    UVA 10718 Bit Mask, bitmap, greed 
 */  
#include   
#include   
#define repd(i, a, b) for (int i = (a); i >= (b); i--)  
  
const int MAXN = 100;  
  
int main() {  
    long long n, l, u, m, t;  
    while (scanf("%lld%lld%lld", &n, &l, &u) != EOF) {  
        int len = ceil(log(u) / log(2));  
        m = 0;  
        repd(i, len, 1) {  
            t = m | (1LL << (i - 1));         //1  
            if (n >> (i - 1) & 1) {  
                if (t <= l) m = t;  
            }  
            else {  
                if (t <= u) m = t;  
            }  
        }  
        printf("%lld\n", m);  
    }  
    return 0;  
}  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU1285――确定比赛名次 下一篇cp命令的编写――浅谈系统调用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis压力测试实战 - (2025-12-27 09:20:24)
·高并发一上来,微服 (2025-12-27 09:20:21)
·Redis 高可用架构深 (2025-12-27 09:20:18)
·Linux 系统监控 的完 (2025-12-27 08:52:29)
·一口气总结,25 个 L (2025-12-27 08:52:27)