Codeforces Round 922 (Div. 2)
题目:
https://codeforces.com/contest/1918/problem/C
思想:
首先使a>b,从左往右找到第二个a和b不同的位置,(第一个位置不交换,为了保证a>b,之后的结果可以统一找每一位使a>b,而达到结果最优。)
找的方法即为如果一个位置上a为1,b为0,那么x此时的位置为1,与 x 异或之后,a变为0,b变为1,相减后会使结果减小,如果 a b 位置上相等,则不影响结果。
进制相减的时候,转化为10进制,再相减,即找到的位置为第 n 位,则a - = 2^n-1, b + = 2^n-1,
注意:找位置的时候,a>>i&1的时候要加上括号,由于 & 的运算符优先度低。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 2e5+5;
const int inf = 0x3f3f3f3f;
ll a,b,r;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--){
cin>>a>>b>>r;
if(a<b) swap(a,b);
int x=0;
for(int i=63;i>=0;i--){
if((a>>i&1)!=(b>>i&1)){
x=i;
break;
}
}
ll ans=0;
for(int i=x-1;i>=0;i--){
ll cnt=1;
for(int j=0;j<i;j++){
cnt*=2;
}
if((a>>i&1)==1&&(b>>i&1)==0&&ans+cnt<=r){
ans+=cnt;
a-=cnt;
b+=cnt;
}
}
cout<<a-b<<"\n";
}
return 0;
}