题意
给定 (a) 和 (b) ,找到一个 (x) 使得 ((aoplus x)+(boplus x)) 的值最小,输出这个值
Solution
考场想法
因为这个 (x) 要和两个数进行异或,所以要找一个合适的值。好像又是废话
因为 (tleq 10^4) ,所以不能进行枚举等非 (O(1)) 操作。
观察样例,发现最后一组的答案为 (0) ,恰好是 (1oplus 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)
我艸,这不就是异或运算吗!
是的,这和我第一个做法最后的结论相同,输出 (aoplus 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
",(a^b));
}
}