原題連接 http://codeforces.com/contest/485/problem/Cios
題意:給出一個區間 l~r 求這個區間內的數中轉換成2進制含‘1’最多的數,如有多組解,則輸出最小的那個數,例如:算法
1(10) = 1(2)spa
2(10) = 10(2)code
3(10) = 11(2)blog
4(10)= 100(2)ci
5(10) = 101(2)input
6(10) = 110(2)it
7(10) = 111(2)io
8(10) = 1000(2)class
9(10) = 1001(2)
10(10) = 1010(2)
3
1 2
2 4
1 10
1
3
7
結果很顯然不作贅述;
1-遍歷一遍顯然不合適,容易超時,因此咱們這裏採用一種"跳着"'向下尋找'的思惟
「跳着」 是指我此次尋找的數有 i 個 1 那麼下一次尋找不可能尋找一個 j<i的數,(7->8就很明顯)
'向下尋找'是指由小向大尋找;
爲了知足上述思想
咱們先假設r是咱們找的那個 咱們就把他先轉換成二進制 ,從第一位開始遍歷若是不是1則變成1,直到r>l 那麼這個狀態上一次的r就是目標數,(---此時你能夠畫一畫試一試想一想這個算法的奇妙之處,以及如何知足"跳着"'向下尋找'的)..
附代碼
1 #include <iostream> 2 typedef long long LL; 3 using namespace std; 4 int main() 5 { 6 int t; 7 cin>>t; 8 while(t--) 9 { 10 LL li,ri; 11 cin>>li>>ri; 12 LL tt=1; 13 while((li|tt)<=ri) 14 { 15 li=li|tt; 16 tt=(tt<<1); 17 } 18 cout<<li<<endl; 19 } 20 }