HDU—5969最大位或
2017-07-22 08:54
477 查看
最大的位或
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1829 Accepted Submission(s): 689
Problem Description
B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
Input
包含至多10001组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 1018。
Output
对于每组数据输出一行,表示最大的位或。
Sample Input
5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000
Sample Output
15
1
2047
511
1000000000000000000
转化二进制 从后往前(从前往后也可以)遍历小数的每一位,碰到0就变成1,找到不大于大数 的最大数 然后异或。
代码写的啰嗦了些。。。。
#include<stdio.h> #define N 100 long long p ; long long s1 ,s2 ; long long a,b,l1,l2; void init() { p[0]=1; int i; for(i=1;i<=70;i++) { p[i]=p[i-1]*2; } } bool judge() { int i; long long num=0; for(i=0;i<l1;i++) { if(s1[i]==1) num+=p[i]; } if(num>b) return true; else return false; } int main() { int n; init(); scanf("%d",&n); while(n--) { long long k,t,i; scanf("%lld %lld",&a,&b); k=0; t=a; while(1) { if(t/2==0) { s1[k++]=t; l1=k; break; } long long c=t%2; s1[k++]=c; t=t/2; } k=0; t=b; while(1) { if(t/2==0) { s2[k++]=t; l2=k; break; } long long c=t%2; s2[k++]=c; t=t/2; } for(i=0;i<l2;i++) { if(s1[i]==0&&s2[i]==0) { s1[i]=1; if(judge()) { s1[i]=0; break; } } } for(i=0;i<l2;i++) { if(s1[i]==1) s2[i]=1; } long long ans=0; for(i=0;i<l2;i++) { if(s2[i]==1||s1[i]==1) ans+=p[i]; } printf("%lld\n",ans); } }
相关文章推荐
- HDU 5969 最大的位或
- HDU 5969 最大的位或 —— 贪心 + 二进制的理解
- HDU 5969 最大的位或
- HDU 5969 最大的位或 (找规律)
- HDU 5969 最大的位或
- hdu_5969_最大的位或(贪心)
- hdu 5969 最大的位或 贪心
- HDU 5969最大的位或
- 最大的位或 HDU - 5969
- hdu 5969 最大的位或 2016ACM/CCPC合肥赛区现场赛I
- HDU 5969 最大的位或
- HDU 5969 最大的位或
- HDU 5969 最大的位或 (思维题 贪心)
- 最大的位或 HDU - 5969
- hdu 5969 最大的位或
- hdu 5969 最大的位或(找规律)
- hdu5969-贪心&思维&证明-最大的异或
- HDU 5969 最大的位或
- hdu-5969 最大的位或(二进制,找规律)
- 【HDU 5969 最大的位或】 + 异或