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