付忠慶的練習小筆記-Codeforces #276 Div2 C

原題連接 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)

input
3
1 2
2 4
1 10
output
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 }
相關文章
相關標籤/搜索