1. 程式人生 > >隨手練——HDU-5969 最大的位或 (貪心)

隨手練——HDU-5969 最大的位或 (貪心)

pro esp 數據 .cn main ont 特殊 規律 strong

HDU-5969:http://acm.hdu.edu.cn/showproblem.php?pid=5969

一開始也是分了類,覺得要兩種情況,l 與 r 位數相同與不同的情況,仔細想一下,可以一起處理,從最高位(左側符號位)開始,遇到不同後面全部補1即可。

剛寫好交信心滿滿,一交就Wrong answer,寫了一個暴力求 的對數器,確定算法是對的,也知道了問題在哪。

  • 第一,數據相同時,沒有結果,要處理。
  • 第二,碰到不同後,將 r 後面的全部置1:
     r = r | (t << s);
    一開始 寫的是 r = r | (1 << s); 我用了1,1默認是int,左移超過31,就超範圍了。
#include <iostream>

using namespace std;
typedef long long ll;

int main() {
    ll l, r,t=1;
    int N;
    cin >> N;
    while (N--) {
        while (cin >> l >> r) {
            int s = 62;
            if (l == r) {
                cout << l << endl;
                
continue; } if (l > r)swap(l, r); while (((l >> s) & 1) == ((r >> s) & 1)) { s--; } while (s--) { r = r | (t << s); } cout << r << endl; } }
return 0; }

心得:貪心法,找普遍規律,處理特殊數據,不要老想知道為什麽這樣解,用暴力法檢驗算法的正確性,算法的證明是數學家的事。

隨手練——HDU-5969 最大的位或 (貪心)