F-神殿-2018年第二届河北省大学生程序设计竞赛(位运算)

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
以下题解参考了这位大佬的博文:https://blog.csdn.net/Soul_97/article/details/80464879
题解:n|n+1 这个表达式的值等于 把n的二进制最后'0'位为转为'1'后的结果,tql.,在保证l<=r的情况下,取最大值(且满足'1'的位数最大,值最小).

最优:

#include <bits/stdc++.h>
using namespace std;

int main(){
    long long l,r;
    cin>>l>>r;
    while((l|l+1)<=r) l|=l+1;
    cout<<l<<endl;
    return 0;
} 
优化前
#include <bits/stdc++.h>
using 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<<l<<endl;
    return 0;
} 

转载于:https://www.cnblogs.com/-yjun/p/10800515.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值