第二届河北省大学生程序设计竞赛——H题
icebound通过勤工俭学,攒了一小笔钱,于是他决定出国旅游。这天,icebound走进了一个神秘的神殿。神殿由八位守护者守卫,总共由64个门组成,每一道门后都有一个迷宫,迷宫的大小均为100×100。icebound在迷宫中总共耗时T小时,消耗食物K公斤。历经千辛万苦之后,icebound终于穿越了迷宫,到达了神殿的中心。神殿的中心有一个宝箱。宝箱上显示有两个正整数L和R。icebound苦思冥想,终于发现一些打开宝箱的线索。你需要找到一个数P,它具有一个美妙的性质:它是[L,R]中所有数的二进制表示里,1的个数最多的一个数。如果你发现了这个美妙的数字,你就可以打开宝箱,获得巨额财富。
比如[4,8]中:
4: 0100
5: 0101
6: 0110
7: 0111
8: 1000
二进制表示中11的个数最多的数是7,它含有3个1。
输入描述
输入一行,两个正整数:L和R,用空格隔开,代表神殿中宝箱上显示的数。
1≤L≤R≤2×10^9
输出描述
一个十进制数P,代表满足条件的解。如果有多个P满足条件,输出最小的P。
样例输入
4 8
样例输出
7
题目分析:
题目给定范围较大,如果每个数都进行循环遍历会超运行时间。
将范围内的数转化成二进制,进行或运算。
关于或运算的解释:
1 | 2 = 3
因为1的二进制是01,2的二进制是10,进行或运算结果是11,11的十进制是3。
6 | 7 = 7
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long int a,b,i;
cin>>a>>b;
i=a;
for(;(i|(i+1))<=b;){
i=i|(i+1);
}
cout<<i;
return 0;
}