UVA 10718 Bit Mask
来源:互联网 发布:嵌入式linux面试题 编辑:程序博客网 时间:2024/05/01 07:43
转载于http://www.cnblogs.com/staginner/archive/2012/01/01/2309477.html
为了使最后or运算的值最大,我们不妨从二进制位的最高位开始依次考虑。如果该位是0的话,我们应该尽量让其变成1,这时我们就可以依据我们的意图算出M可能的最小值和最大值,如果这个区间和L、U这个区间有交集的话,就说明我们是可以把这一位变成1的。同理,如果该位是1的话,无论M的这位是什么,最后这位还是为1,但为了让M尽量小,我们应该尽可能让这一位为0。当然,这时你是否会怀疑这样一个问题,如果这位为0的话,相比为1就会让整体的可能值变小了,会不会后面有1位是0而我们即便该位选1都达不到下限呢?这个是不会的,因为如果该位选1都达不到下限就说明后面全部是1都达不到下限,那么只能说明在上一步的选择的时候就已经违背了规则,这样就矛盾了,所以不会出现这种情况。
#include<iostream>#include<cstring>#include<cstdio>using namespace std;int main(){ //freopen("in.txt","r",stdin); long long int bit[34]; int num[32]; bit[0]=1; for(int i=1; i<=32; i++) bit[i]=bit[i-1]*2; long long int N,L,U,aim,min,max; int hg; while(scanf("%lld%lld%lld",&N,&L,&U)!=EOF) { memset(num,0,sizeof(num)); hg=0; while(N/2) { num[hg++]=N%2; N/=2; } num[hg++]=N; aim=0; for(int i=31; i>=0; i--) { if(num[i]==1) { min=aim; max=aim+bit[i]-1; if(min<=U&&max>=L); else aim+=bit[i]; } else if(num[i]==0) { min=aim+bit[i]; max=aim+bit[i+1]-1; if(min<=U&&max>=L) aim=min; } } cout<<aim<<endl; } return 0;}
- UVa 10718 - Bit Mask
- UVa 10718 - Bit Mask
- uva 10718 - Bit Mask
- uva 10718 - Bit Mask
- UVA 10718 Bit Mask
- UVa 10718 - Bit Mask
- uva 10718 Bit Mask
- UVA - 10718 Bit Mask
- uva 10718 - Bit Mask
- UVA 10718 Bit Mask
- UVa 10718 - Bit Mask
- UVA - 10718 Bit Mask
- UVA 10718 Bit Mask
- uva 10718 Bit Mask
- UVA - 10718 Bit Mask 贪心
- UVA 10718 Bit Mask (快速幂 + 贪心)
- uva 10718 Bit Mask (位运算)
- uva 10718 Bit Mask(贪心)
- 阅读笔记(2)
- 图像处理和计算机视觉中的经典论文
- 2013年7月22日
- VC中PC/SC智能卡接口的编程
- js实现文本框回车切换焦点
- UVA 10718 Bit Mask
- 13暑假集训 5 总结
- Bit++
- 为什么做百度SEO优化比竞价好?
- C++类的继承与多重继承的访问控制
- 实现用后缀数组求字符串的最长重复字串
- 数据结构(5) 链栈 c++ 模板实现
- js给td 设置clospan 在ie7以下失效原因
- 程序员不爱读书,但这很不明智——想看就看《高效能程序员的修炼》