Codeforces Round #276 (Div. 1)Bits
2014-11-06 16:52 达利园大面包 阅读(116) 评论(0) 收藏 举报题意就是给你一个区间[l,r],求这个区间中化成二进制形式1最多的数,如果有多解输出最小值.
贪心即可,把l化为二进制,把最右边不是0的变成1.
例如 19 30
10011 11110
第一步 10011-->10111
第二步 10111-->11111大于30退出循环 答案即是10111
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int main(){
int t;
for(scanf("%d",&t);t;t--){
unsigned long long lef,rig;
cin>>lef>>rig;
for (int i=0;i<64;i++){
if (((1LL<<i)&lef)==0){
if (((1LL<<i)|lef)<=rig){
lef |= (1LL<<i);
}else{
break;
}
}
}
cout<<lef<<endl;
}
return 0;
}
浙公网安备 33010602011771号