神殿

博客讲述了关于一个编程问题的解决过程,icebound在神秘神殿中遇到一个挑战,需要找到[l, r]区间内二进制1个数最多的数字。问题涉及到位运算和进制转换,解决方案是通过位运算比较每个数与下一个数,找出满足条件的最小数字。" 41284365,4868087,使用Lock的超时获取策略,"['并发控制', 'Java并发', '锁机制', '多线程', '并发编程']

2016: 神殿

描述

题目描述:

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

比如[4,8][4,8]中:

4: 0100
5: 0101
6: 0110
7: 0111
8: 1000

二进制表示中11的个数最多的数是77,它含有33个11。

输入:

输入一行,两个正整数:ll和rr,用空格隔开,代表神殿中宝箱上显示的数。

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

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

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

输出:

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

样例输入

4 8

样例输出

7

感觉现在对位运算和进制的赛题考查很多,这题用到了位运算,把当前的数字和下一个数字进行或运算看是否是所有位都进位的数组,并且进位后与原始数字相与的全一结果是否比右端点值大,如果大说明是符合条件的一的个数最多并且最小的数。比赛时发现这个规律至关重要,我当时找到规律是n=log2 r ,再置n位一,没有能解出此题,还是需要提高这方面的解题能力吧。 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long i,l,r,t;
    scanf("%lld %lld",&l,&r);


    for(i=l;i<=r;i++)                                       //第一次提交90.0%  cpu时间超时
    {                                                       //第二次提交什么都没有改,就过了
        if((i|i+1)>r)
        {
            t=i;
            break;
        }
    }


    printf("%lld",t);

}

 

562922201616561计科1601正确100%C++2522018-05-25 19:58:22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值