hdu 5969 最大的位或
2017-03-14 13:34
441 查看
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
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
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; long long l,r; int a1[200],a2[200]; int binary(int* a ,long long num){ int len = 0; while(num){ a[len++] = num%2; num/=2; } return len; } long long my_pow(int num, int len){ long long ans = 1; for(int i=1;i<=len;i++) ans*=num; return ans; } int main(){ int t;scanf("%d",&t); while(t--){ scanf("%lld%lld",&l,&r); int len2 = binary(a2,r); int len1 = binary(a1,l); long long ans = 0; if(len1 < len2){ ans = my_pow(2,len2)-1; } else{ for(int i=len2-1;i>=0;i--){ if(a1[i]==1 && a2[i]==1){ ans += my_pow(2,i); } else if(a2[i] == 1 && a1[i] == 0){ ans += 2*my_pow(2,i)-1; break; } } } printf("%lld\n",ans); } return 0; }
相关文章推荐
- hdu 5969 最大的位或 2016ACM/CCPC合肥赛区现场赛I
- hdu 5969 最大的位或【贪心】
- 最大的位或 HDU - 5969
- HDU 5969 最大的位或
- hdu 5969 最大的位或(找规律)
- hdu_5969_最大的位或(贪心)
- HDU 5969 最大的位或 (思维题 贪心)
- hdu-5969 最大的位或(二进制,找规律)
- HDU 5969 最大的位或
- HDU 5969 最大的位或
- HDU 5969 最大的位或
- HDU 5969 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))
- hdu 5969 最大的位或
- HDU 5969 最大的位或 —— 贪心 + 二进制的理解
- HDU 5969最大的位或
- 2016 ccpc HDU 5969 最大的位或
- HDU 5969 最大的位或 (找规律)
- hdu 5969 最大的位或 贪心
- HDU 5969 最大的位或
- hdu5969-贪心&思维&证明-最大的异或