zoukankan      html  css  js  c++  java
  • F-神殿-2018年第二届河北省大学生程序设计竞赛(位运算)

    icebound通过勤工俭学,攒了一小笔钱,于是他决定出国旅游。这天,icebound走进了一个神秘的神殿。神殿由八位守护者守卫,总共由
    6464
    64个门组成,每一道门后都有一个迷宫,迷宫的大小均为
    100×100100 imes 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;
    } 
    
  • 相关阅读:
    怎样用OpenScales发布这些瓦片地图?
    mysql在linux下命令备份数据库
    jQuery EasyUI
    JQuery遮罩层登录
    C#通过线程完成定时执行事件
    JS中showModalDialog 详细使用
    sql时间函数
    asp网页设计流量统计代码
    Rational Rose、PowerDesign、visio的比较
    win环境下eclipse安装指引
  • 原文地址:https://www.cnblogs.com/-yjun/p/10800515.html
Copyright © 2011-2022 走看看