CF1421A XORwice
题意
给定 \(a\) 和 \(b\) ,找到一个 \(x\) 使得 \((a\oplus x)+(b\oplus x)\) 的值最小,输出这个值
Solution
考场想法
因为这个 \(x\) 要和两个数进行异或,所以要找一个合适的值。好像又是废话
因为 \(t\leq 10^4\) ,所以不能进行枚举等非 \(O(1)\) 操作。
观察样例,发现最后一组的答案为 \(0\) ,恰好是 \(1\oplus 1\) 的值。
这时就可以有一个大胆的想法,是不是答案就是给出的 \(a,b\) 异或之值。
将样例进行验证,发现是对的。
完结撒花
蒟蒻认为的正确做法
因为异或也是按位运算,所以考虑对某一位进行考虑,然后扩展到所有位上。
如果 \(a\) 和 \(b\) 的某一相同位上一个是 \(0\) ,一个是 \(1\) ,那么 \(x\) 那一位上不管是什么,异或完还是一个 \(0\) 和一个 \(1\) 。也就是相加永远为 \(1\) ,所以不用管。
如果 \(a\) 和 \(b\) 的某一相同位上均为 \(1\) 或 \(0\) ,那么 \(x\) 那一位只要对应为 \(1\) 或 \(0\) 就可保证异或完相加为 \(0\) 。
现在总结一下,就是: \(a,b\) 某一位相同,则答案对应的那一位为 \(0\) , \(a,b\) 某一位不同,则答案对应的那一位为 \(1\)
我艸,这不就是异或运算吗!
是的,这和我第一个做法最后的结论相同,输出 \(a\oplus b\) 即可。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&a,&b);
printf("%d\n",(a^b));
}
}