2018河北省赛--神殿(位运算)

转自http://www.hankcs.com/program/cpp/poj-1995-raising-modulo-numbers.html

题目链接:http://acm.zzuli.edu.cn/problem.php?cid=1381&pid=5

题目描述

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

输入

输入一行,两个正整数:lr,用空格隔开,代表神殿中宝箱上显示的数。
1 ≤ l ≤ r ≤ 2 × 109

输出

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

样例输入 Copy

4 8

样例输出 Copy

7

位运算好强大QAQ

#include<iostream>
using namespace std;
typedef long long ll;
ll ex(ll a){
    ll res=0;
    while(a){
        if(a&1==1) res++;
        a>>=1;
    }
    return res;
} //这里没用到,这个可以计算数字二进制里1的个数
int main(){
    ll l,r;
    cin>>l>>r;
    while((l|(l+1))<=r){
        l|=(l+1);
    }
    cout<<l<<endl;
    return 0;
}
发布了153 篇原创文章 · 获赞 46 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_40922859/article/details/89222864
今日推荐