2016年中国大学生程序设计竞赛(合肥)-重现赛1009 HDU 5969
2016-11-05 18:09
405 查看
最大的位或
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 18 Accepted Submission(s): 17
[align=left]Problem Description[/align]
B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
[align=left]Input[/align]
包含至多10001组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 1018
。
[align=left]Output[/align]
对于每组数据输出一行,表示最大的位或。
[align=left]Sample Input[/align]
5
1 10
0 1
1023 1024
233 322
1000000000000000000
1000000000000000000
[align=left]Sample Output[/align]
15
1
2047
511
1000000000000000000
[align=left]Source[/align]
2016年中国大学生程序设计竞赛(合肥)-重现赛(感谢安徽大学)
题意:中文题面
题解:被选择的两个数中,其中的一个数一定是区间的上界,寻找另一个数 初始全部为1 从高位到低位模拟。
#include<iostream> #include<cstdio> #define ll __int64 using namespace std; ll l,r; int t; int s1[70]; int s2[70]; int s3[70]; int len=0; int len1=0; bool cmp1( int * ss,int *tt) { for(int i=len-1; i>=0; i--) { if(ss[i]==tt[i]) continue; if(ss[i]>tt[i]) return true; if(ss[i]<tt[i]) return false; } return true; } bool cmp2( int * ss,int *tt) { for(int i=len-1; i>=0; i--) { if(ss[i]==tt[i]) continue; if(ss[i]>tt[i]) return false; if(ss[i]<tt[i]) return true; } return true; } void ans() { for(int i=len-1; i>=0; i--) { if(s2[i]==1||s1[i]==1) s1[i]=1; } ll exm=1; ll re=0; for(int i=0; i<=len-1; i++) { if(s1[i]) re+=exm; exm*=2; } cout<<re<<endl; } int main() { scanf("%d",&t); for(int i=1; i<=t; i++) { int flag=0; len=0; len1=0; scanf("%I64d %I64d",&l,&r); ll zha=r; while(r>0) { if(r&1) s1[len++]=1; else s1[len++]=0; r>>=1; } for(int j=0; j<len; j++) { s2[j]=1; s3[j]=0; } while(l>0) { if(l&1) s3[len1++]=1; else s3[len1++]=0; l>>=1; } for(int j=len-1; j>=0; j--) { if(s1[j]==1) continue; if(s1[j]==0) { s2[j+1]=0; if(cmp1(s2,s3)&&cmp2(s2,s1)) { ans(); flag=1; break; } else { s2[j+1]=s1[j+1]; s2[j]=s1[j]; } } } if(flag==0) cout<<zha<<endl; } return 0; }
相关文章推荐
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1001 HDU 5961
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1008 HDU 5968
- HDU 5969 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))
- HDU 5969 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))
- HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))
- HDU 5968 异或密码 【模拟】 2016年中国大学生程序设计竞赛(合肥)
- HDU 5968 异或密码 【模拟】 2016年中国大学生程序设计竞赛(合肥)
- 2016年中国大学生程序设计竞赛(合肥)-重现赛(感谢安徽大学) A E H I
- HDU 5963 朋友 【博弈论】 (2016年中国大学生程序设计竞赛(合肥))
- 2016年中国大学生程序设计竞赛(合肥)-重现赛
- 2016年中国大学生程序设计竞赛(合肥)-重现赛(感谢安徽大学)(5/10)
- HDU 5961 传递 【图论+拓扑】 (2016年中国大学生程序设计竞赛(合肥))
- HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))
- HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))
- (2016年中国大学生程序设计竞赛(杭州)-重现赛) ArcSoft's Office Rearrangement 模拟
- HDU 5938 Four Operations(2016年中国大学生程序设计竞赛(杭州))
- 2016年中国大学生程序设计竞赛(杭州)-重现赛【01,02,03,06】
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
- HDU 5935 Car 【模拟】 (2016年中国大学生程序设计竞赛(杭州))
- 2016年中国大学生程序设计竞赛(杭州)-重现赛