题意就是给你一个区间[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; }
时间: 2024-10-24 06:26:54