HDU 5969 最大的位或

2022-02-01 20:15:43 字數 755 閱讀 5382

題意:給定乙個區間,在這個區間內找到兩個數,使得他們的位或值最大。

思路分析:我們可以從二進位制的角度來思考這個問題,我們有了乙個區間,那麼我們最終答案的二進位制的位數也就有了限制,那麼我們想要做的就一定是盡可能地把這些二進位制位全部變成1。由於我們一共選兩個數字或取最大值,區間最大值是一定要選的,因為只有這樣我們後續需要填的1才能盡可能小,落在區間內。之後就是將另乙個數一位一位的拆開,再分別和答案進行計算,由於有區間的限制,我們在位或一位時先將它和左區間進行位或,看是不是小於右區間,再將該位和答案進行計算。

**:

1 #include2 #include3 #include4 #include5

using

namespace

std;

6 typedef long

long

ll;7

const

int n=1e6+10;8

intmain()

18 printf("

%lld\n

",ans);19}

20return0;

21 }

view code

HDU 5969 最大的位或

開始這道題一直想著直接位運算去遍歷,排除情況,但資料量還是很大,後來把兩個數二進位制所有位都分別放在兩個bool型陣列裡,就簡單多了,只需要考慮輸入的那兩個數從哪一位開始出現不同,小數也就是下界,其到上界之內一定會出現與下界位數相等並所有位數全1的數,所以以上界數為基礎,存在乙個數使它一段字尾或運算...

HDU 5969 最大的位或

首先感謝這位前輩的部落格 這裡詳細說下自己的理解。這題主要是思路 輸入兩個整數l和r,求兩個數滿足l x y r,使得x y最大。另ans x y,那麼ans肯定的位數肯定和r一樣,因為位數越多,這個數就越大,位數最多的肯定是r。所以我們先把r用二進位制表示,把每一位存在乙個陣列裡面。然後從二進位制...

hdu 5969 最大的位或(貪心)

對於乙個l和r 我們都看成2進製 最優情況一定是1000和0111來異或這樣就能得到在位數不可能改變的情況下能夠得到的最大值,那麼如果l到r能夠存在這種情況就這麼異或 但如果l和r的位數相同,那麼就保留前面相同位數上的0和1,一旦遇到不同則按照以上方法對低位取 xx1000和 xx0111異或 in...