icebound通过勤工俭学,攒了一小笔钱,于是他决定出国旅游。这天,icebound走进了一个神秘的神殿。神殿由八位守护者守卫,总共由
6464 64个门组成,每一道门后都有一个迷宫,迷宫的大小均为 100×100100 \times 100 100×100。icebound在迷宫中总共耗时 TT T小时,消耗食物 KK K公斤。历经千辛万苦之后,icebound终于穿越了迷宫,到达了神殿的中心。神殿的中心有一个宝箱。宝箱上显示有两个正整数 ll l和 rr r。icebound苦思冥想,终于发现一些打开宝箱的线索。你需要找到一个数 PP P,它具有一个美妙的性质:它是 [l,r][l,r] [l,r]中所有数的二进制表示里, 11 1的个数最多的一个数。如果你发现了这个美妙的数字,你就可以打开宝箱,获得巨额财富。 比如 [4,8][4,8] [4,8]中: 4: 0100 5: 0101 6: 0110 7: 0111 8: 1000 二进制表示中 11 1的个数最多的数是 77 7,它含有 33 3个 11 1。---------------------------------分割线-5/1---------------
题意:求出 [ l , r ] 之间,其二进制中所含 '1'最多的数.
####题解:现将 l 转化为 二进制 ,然后从低位到高位找'0'位,如果把'0'转化为'1'后所对应的数 <= r,那么就存下这个数.枚举完后,所存的数就是最优解.
tips:我是弟弟啊,我写复杂了,呜呜呜呜 -5/2
以下题解参考了这位大佬的博文:
题解:n|n+1 这个表达式的值等于 把n的二进制最后'0'位为转为'1'后的结果,tql.,在保证l<=r的情况下,取最大值(且满足'1'的位数最大,值最小).
最优:
#includeusing namespace std;int main(){ long long l,r; cin>>l>>r; while((l|l+1)<=r) l|=l+1; cout< <
优化前
#includeusing namespace std;const int N=44;int a[N],cnt=0;typedef long long ll;int main(){ int l,r; cin>>l>>r; int tl=l; while(tl>0){ a[++cnt]=tl%2; tl/=2; } for(int i=1;i<=33;i++){ if(a[i]==0){ if(l+((ll)1<<(i-1))<=r){ l=l+(1<<(i-1)); } else break; } } cout< <