这个题考察了异或运算和贪心策略,对位运算不熟悉的人可能会有些懵逼,比如我.
1,首先要想明白的一件事是,如果a,b某二进制位相同,那不管x这一位是0,还是1,最后这一位相减的结果都为0,无影响,所以从两个数第一个不同的位开始考虑即可,以此为最高位
2,第二,而如果a,b这一位不同,那么x为1的话会反转这一位相减的结果(即变成相反数).
所以如果最高位为正,则后面的结果尽可能为负即可,最高位为负,则后面的结果尽可能为正即可,这里说尽可能,是因为,x有范围限制
3,那么最高位是改还是不改呢,不改.
如果最高位可改,你改了,会导致后面可能无法改(因为x有范围限制),你不改,则后面每一位都改了都行(因为你连最高位都可以改了,后面的总和是不会超过最高位的),所以,不改操作空间大
如果最高位不可改,那就别想了,从后面寻找机会吧
所以干脆保留最高位的结果,尽可能把后面的结果改成最优
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
int a,b,r;
cin>>a>>b>>r;
int now=0;
bool is_high=1;
for(int i=63;i>=0;i--)
{
bool px=(a&(1ll<<i));
bool py=(b&(1ll<<i));
//cout<<"i=="<<i<<" "<<"px=="<<px<<" "<<"py=="<<py<<"\n";
if(px==py)continue;
if(is_high)
{
now=(px-py)*(1ll<<i);//加上最高位的贡献
is_high=0;
}
else
{
if(r>=(1ll<<i)&&(px-py)*now>0)
{
r-=(1ll<<i);
now-=(px-py)*(1ll<<i);
}//当前与now同号,要变号
else
{
now+=(px-py)*(1ll<<i);
}
}
}
cout<<abs(now)<<"\n";
}
return 0;
}