C. XOR-distance (位运算 异或+二进制减法)

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
using namespace std;

typedef long long ll;
typedef pair 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=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&1)==1&&(b>>i&1)==0&&ans+cnt<=r){
				ans+=cnt;
				a-=cnt;
				b+=cnt;
			}
		}
		cout<

你可能感兴趣的:(算法)