神殿【二进制异或】2018河北省程序设计 H题

版权声明:文章原创,未经允许请勿转载 https://blog.csdn.net/DanBo_C/article/details/89921617

神殿

题目描述:
icebound通过勤工俭学,攒了一小笔钱,于是他决定出国旅游。这天,icebound走进了一个神秘的神殿。神殿由八位守护者守卫,总共由64个门组成,每一道门后都有一个迷宫,迷宫的大小均为100×100 100 \times 100100×100。icebound在迷宫中总共耗时T小时,消耗食物K公斤。历经千辛万苦之后,icebound终于穿越了迷宫,到达了神殿的中心。神殿的中心有一个宝箱。宝箱上显示有两个正整数l和r。icebound苦思冥想,终于发现一些打开宝箱的线索。你需要找到一个数P,它具有一个美妙的性质:它是[l,r]中所有数的二进制表示里,1的个数最多的一个数。如果你发现了这个美妙的数字,你就可以打开宝箱,获得巨额财富。
比如[4,8]中

4: 0100
5: 0101
6: 0110
7: 0111
8: 1000
1
2
3
4
5
二进制表示中11的个数最多的数是7,它含有3个1。
输入:
输入一行,两个正整数:ll和rr,用空格隔开,代表神殿中宝箱上显示的数。

1≤T<231 1 \leq T < 2^{31}1≤T<2
31

1≤K≤105 1 \leq K \leq 10^51≤K≤10
5

1≤l≤r≤2×109 1 \leq l \leq r \leq 2 \times 10^{9}1≤l≤r≤2×10
9

输出:
一个十进制数P,代表满足条件的解。如果有多个P满足条件,输出最小的P。

解题思路

二进制异或。由于这部分自学不深。刚看到题的时候是打算用逐位取余来做,肯定超时了。百度了一下,大佬都是用这种方法。刚开始不太明白,就写了一下。
1 | 0001
2 | 0010
3 | 0011
4 | 0100
5 | 0101
6 | 0110
7 | 0111
8 | 1000
9 | 1001
10| 1010

1|2 = 0001 | 0010 = 0011 = 3
3|4 = 0011 | 0100 = 0111 = 7
7|8 = 0111 | 1000 = 1111 = 16
16>10
所以答案为7
注意看二进制异或的左边和右边
发现规律

代码

#include<iostream>
using namespace std;
int main()
{
	long long l,r;
	cin>>l>>r;
	while( (l|(l+1) )<= r)
	{
		l = l|(l+1);
	}
	cout<<l;
}

猜你喜欢

转载自blog.csdn.net/DanBo_C/article/details/89921617