hdu 5969 最大的位或 找規律)

2021-08-07 12:28:51 字數 603 閱讀 4730

前面的部落格已經提到了這題,就不貼上原題了,只想說說另外一種思路。)

思路:如果位或值要最大,首先結果的二進位制形式位數得最大,而且高位盡量多1,所以r必須是使得兩個數組合位或值最大中的乙個,結果的最小值也是r(自身與自身位或結果不變),接下來就是要盡量使得,r二進位制形式下中的0盡可能變為1這就要求與之位或的另外乙個數此位必須為1,從高位和低位開始遍歷都可以,以低位開始遍歷為例子,假設r的二進位制數為111011,容易知道,與之最接近的並且能使第四位變為1的數為110111,只要判斷一下在不在l~r這個範圍內就好了,如果不在就可以直接得出答案,不用再向高位考慮了,因為如果低位不滿足,說明r與l相差小,而要使得高位的0變為1,則r與l相差的更大,不可能在l~r這個範圍內了。

**:#include#includeusing namespace std;

#define ll long long

int bit[65];

ll getsum(int n)

sum=0,ans=0;

for(int i=0; i=l)

bit[i]=1;

else break;

}else sum+=getsum(i);

}for(int i=0; i

HDU 5969 最大的位或

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

HDU 5969 最大的位或

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

HDU 5969 最大的位或

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