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≤l≤r≤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);
}
562922 | 2016 | 16561 | 計科1601 | 正確 | 100% | C++ | 252 | 2018-05-25 19:58:22 |