这是一道神奇的题,题意是给你一个A和B,然后你可以进行一个操作,第一步可以选a或者b使其加一,第二步可以使a或者b加2 。。。以此类推,最后问你最少执行多少步使得两个数相同。问题十分的离谱,咱们可以先这样看,让a变成最小的那个,b变成最大的那个,然后让a变成0, b变成b-a, 假设你加了k步并且都给了a,使得a大于b, 如果说你需要抽出来其中某一步的操作,让其对b操作,那么对a来说就减去了一个数,对b来说就加上了一个数,这样对 b-a 的变化量一定是一个偶数,并且你可以惊奇的发现,这个差值是很容易被构造出来的,这样解法就变的很简单,只需要找出第一个对a k补操作之后a就大于b 之后,再向后看他们的差值什么时候是偶数即可。
题目:
ac代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 2e5 + 10;
typedef long long int LL ;
int main()
{
int t;
cin >> t;
while(t--)
{
LL a, b ;
cin >> a >> b ;
a = abs(a - b);
int l = 0 ,r = 1e9;
while(l < r)
{
LL mid = l + r >> 1;
if( (mid * mid + mid )/ 2 >= a)r = mid;
else l = mid + 1;
}
while( ((l * l + l)/ 2 - a) % 2!= 0)l ++ ;
cout << l <<endl;
}
}