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));
	}
} 
posted @ 2020-10-19 21:33  jasony_sam  阅读(148)  评论(0)    收藏  举报