HDU 5969 最大的位或

2021-07-24 09:54:19 字數 592 閱讀 5793

開始這道題一直想著直接位運算去遍歷,排除情況,但資料量還是很大,後來把兩個數二進位制所有位都分別放在兩個bool型陣列裡,就簡單多了,只需要考慮輸入的那兩個數從哪一位開始出現不同,小數也就是下界,其到上界之內一定會出現與下界位數相等並所有位數全1的數,所以以上界數為基礎,存在乙個數使它一段字尾或運算全為1。最後上界數變換完就是結果。例如:二進位制100100101101和100101101011第六位發現不一樣,所以在這之間必然有100100111111,然後就把後面上界數》6的位都變成1。

#include#include#include#includeusing namespace std;

__int64 a,b;

bool a[65],b[65];

int main()

int i=64;

for(i=1;i<=64;i++)

}for(i=i+1;i<=64;i++)

b[i]=1;

__int64 sum=0;

for(i=1;i<=64;i++)

printf("%i64d\n",sum);

}return 0;

}

HDU 5969 最大的位或

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

HDU 5969 最大的位或

題意 給定乙個區間,在這個區間內找到兩個數,使得他們的位或值最大。思路分析 我們可以從二進位制的角度來思考這個問題,我們有了乙個區間,那麼我們最終答案的二進位制的位數也就有了限制,那麼我們想要做的就一定是盡可能地把這些二進位制位全部變成1。由於我們一共選兩個數字或取最大值,區間最大值是一定要選的,因...

hdu 5969 最大的位或(貪心)

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