隨手練——HDU-5969 最大的位或 (貪心)
阿新 • • 發佈:2019-02-08
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 最大的位或 (貪心)