題目鏈接:https://codeforces.com/contest/1278/problem/B
題目大意:
給定兩個整數a,b,現在進行以下的操作:
第一次操作,從a,b兩個數中選擇一個+1。
第二次操作,從a,b兩個數中選擇一個+2。
第三次操作,從a,b兩個數中選擇一個+3。
....
問你最少需要多少步驟的操作,使得a,b兩個整數相等?
思路:
要讓兩個數相等,我們肯定儘可能地彌補兩個數的差值,設比較小的數爲a,比較大的數位b,兩者差值爲del
我們先將所有操作給到a身上,直到a>=b,此時有
newdel爲新的差值。
- 如果newdel爲偶數,我們考慮之前加在a上的值:1+2+3+...+k。如果現在我們不把一個數x加在a上,而是加在b上,那麼對於上面的等式,是不是就相當於將newdel減去2*x呢?也就是說,我可以通過改變之前的k個操作的位置,構造出任何小於k*(k+1)的偶數的差!所以,此時答案就是k。
- 如果newdel爲奇數,我們通過上面的方法只能構造出偶數,所以不能再向上面那樣操作了。我們再在a上加上k+1,此時newdel=newdel+k+1,我們又可以接着利用上面的結論判斷:
- 如果k+1爲奇數,那麼newdel+k+1爲偶數,可以湊出來,答案就是k+1
- 如果k+1爲偶數,那麼newdel+k+1爲奇數,此時仍然不能湊出來,但是k+2一定是奇數,newdel+k+2一定可以構造出來,所以答案就是k+2
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=100000+10;
int sum[maxn];
void init(){
sum[0]=0;
for(int i=1;i<maxn;i++){
sum[i]=sum[i-1]+i;
}
}
signed main(){
int T;
init();
scanf("%lld",&T);
while(T--){
int a,b;
scanf("%lld%lld",&a,&b);
int del=abs(a-b);
if(del==0){
puts("0");
continue;
}
int ans=0;
int inx=0;
for(int i=1;i<maxn;i++){
if(sum[i]>=del){
ans=sum[i];
inx=i;
break;
}
}
if(ans==del){
printf("%lld\n",inx);
}
else{
int now=ans-del;
if(now%2==0){
printf("%lld\n",inx);
}
else{
if((inx+1)%2==0){
printf("%lld\n",inx+2);
}
else{
printf("%lld\n",inx+1);
}
}
}
}
return 0;
}
/*
100
1 1000000000
999999999 1
1 999999998
999999997 1
1 999999996
999999995 1
1 999999994
999999993 1
1 999999992
999999991 1
1 999999990
999999989 1
1 999999988
999999987 1
1 999999986
999999985 1
1 999999984
999999983 1
*/