唉唉唉不会二进制唉唉 Codeforces Round 922(Div.2)
C:题目XOR-distance 大意——给你三个整数a,b,r,让你求一个x,这个x满足 0<=x<=r使得abs((a^x)-(b^x))最小(二进制)
做法:我们从大小到看a和b的每一个二进制,比较1如果相同则跳过,因为它们两个相同无论x的那一位二进制取多少它俩异或完还是相同2它们两个不相同,我们此时就需要一个总和sum用sum记录前面的所有的和,a的每一位异或是减去b每一位异或的值,所以a对sum的贡献是加,b是减,当它们这一位不一样时,我们可以先比较不对x进行取值sum的情况即if(bb==1)now=-now if(abs(sum+now)<=abs(sum-now)) 这种情况就不用让x的这一位取值,已经是最优,否则2就要改变x在满足小于r的前提下的当前的二进制位,就可!
void solve()
{
LL a,b,r;cin>>a>>b>>r;
LL sum=0,now;
LL x=0;//答案
for(int i=62;i>=0;i--)
{
LL aa=(a>>i&1),bb=(b>>i&1);
if(aa==bb)continue;
now=1LL<<i;
if(bb==1)now=-now;
if(abs(sum+now)<=abs(sum-now))sum+=now;//不需要改变x的当前这一位
else
{
if(r>=1LL<<i)//当前x可以变,即满足提前条件<=r
{
r-=1LL<<i;
sum-=now;
x+=1LL<<i;
}
else sum+=now;//变不了了
}
}
cout<<abs((a^x)-(b^x))<<endl;
}