操作
先假设a+t=b+l
那么是不是可以推出
abs(a-b)+t=b+l 设a-b 为x
所以我们现在只需要考虑 (a-b, 0) 的问题怎么解决。与其思考怎么把 1, 2, · · · , k
这 k 个数字分配到两边,不如考虑先把 k 个数字全部加到 0 那儿去再取一些回
来。
把k个数全都加到0上面后0变成了(k-1)*k/2设其为s
如果 s < (a-b)就接着加,否则就考虑把加到 s 里的数字挪一些过去给 (a-b)。
重点来了,挪数字是不会改变s-x的奇偶性辣么可以发现s-x为奇数时无解,
s − x 是偶数时,显然将 (s−x)/2挪过去就可以了。
总结: 那么直接一路加 1, 2, 3, · · · ,直到发现 s ≥ x 且 s−x 是偶数的时候输出加的次数即可。
别忘了加a==b的特判。
代码
#include<bits/stdc++.h> #define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; int main() { io; int t; cin>>t; while(t--) { int a,b; cin>>a>>b; int x=max(a,b)-min(a,b); if(x==0) printf("0\n"); else { int t1=0; for(int i=1;i>=0;i++) { t1+=i; if(t1>=x&&(t1-x)%2==0) { printf("%d\n",i); break; } } } } return 0; }