神殿(河北省大学生程序设计竞赛——H题)

第二届河北省大学生程序设计竞赛——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;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值