CF1421A - XORwice(位运算 + 贪心 + 数学规律 / 入门级)

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 成文


posted @ 2022-03-02 21:10  hh2048  阅读(35)  评论(0编辑  收藏  举报