1. 程式人生 > 其它 >CF1421A - XORwice(位運算 + 貪心 + 數學規律 / 入門級)

CF1421A - XORwice(位運算 + 貪心 + 數學規律 / 入門級)

【2022.03.02】隊內賽第一題,【2022.03.02】補題

1421A - XORwice(源地址自⇔CF1421A

目錄

tag

⇔位運算、⇔貪心、⇔數學規律、⇔入門級(*800)

題意

給定 \(a\)\(b\) 兩個數字,你需要找到一個 \(x\) ,使得 \((a \bigoplus x) + (b \bigoplus x)\) 最小。其中, \(\bigoplus\) 表示異或( \(\tt{}Xor\) )操作。

思路

由於15分鐘還沒解出來並且還 \(\tt{}WA\) 了一次的原因,特寫一篇題解來表示悲憤。

我們知道,只有式子的$(a \bigoplus x) $ 和 $ (b \bigoplus x)$ 同時為最小值時,其和才為最小,考慮這樣的情況。不妨假設 \(a\) 的第 \(i\) 位與 \(b\) 的第 \(i\) 位相同,那麼顯然的,為了答案最小, \(x\) 的這一位也應當是相同的,這一位的答案就是 \(0\) ;相對應的,如果 \(a\) 的第 \(j\) 位與 \(b\) 的第 \(j\) 位不相同,那麼 \(x\) 的這一位可以取任意數字,這一位的答案就是 \(1\)

至此,答案已經與 \(x\) 沒有關係。一句話總結上述規律,對於某一位 \(i\) ,如果給定兩個數字的這一位相同,那麼這一位的答案就是 \(0\)

;相反,如果不同,那麼這一位的答案就是 \(1\) ——相同出 \(0\) ,不同出 \(1\) ,這即是異或的定義

AC程式碼

點選檢視程式碼
void solve()
{
  int x, y; cin >> x >> y;
  cout << (x ^ y) << endl;
}

錯誤次數

(賽時1)未找到完整規律而直接硬算。

參考內容

某位大佬的題解,提供了異常清晰的思路

百度百科才是永遠滴神,給以蒟蒻知識


文 / WIDA
2022.03.02 成文
首發於WIDA個人部落格,僅供學習討論


更新日記:
2022.03.02 成文