原題:
B. A and B
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given two integers a and b. You can perform a sequence of operations: during the first operation you choose one of these numbers and increase it by 1; during the second operation you choose one of these numbers and increase it by 2, and so on. You choose the number of these operations yourself.
For example, if a=1 and b=3, you can perform the following sequence of three operations:
add 1 to a, then a=2 and b=3 ;
add 2 to b, then a=2 and b=5 ;
add 3 to a, then a=5 and b=5
Calculate the minimum number of operations required to make a and b equal.
Input
The first line contains one integer t
(1≤t≤100) — the number of test cases.
The only line of each test case contains two integers a and b (1≤a,b≤10^9).
Output
For each test case print one integer — the minimum numbers of operations required to make a
and b equal.
Example
Input
3
1 3
11 11
30 20
Output
3
0
4
Note
First test case considered in the statement.
In the second test case integers a
and b
are already equal, so you don’t need to perform any operations.
In the third test case you have to apply the first, the second, the third and the fourth operation to b
(b turns into 20+1+2+3+4=30).
中文:
給你兩個數a和b,每次可以在a或者b上加i,i從1開始,每次遞增1。最後問你最少執行多少次加法運算可以使a和b相等。
代碼:
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<string.h>
using namespace std;
const int maxn = 300005;
typedef long long ll;
typedef pair<ll, ll> pll;
ll x, y;
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
cin >> x >> y;
if (x == y)
{
cout << 0 << endl;
}
else
{
ll d = abs(x - y);
ll ans = 1;
while (true)
{
ll sum = ans*(ans + 1) >> 1;
if (sum >= d && (sum & 1) == (d & 1))
{
cout << ans << endl;
break;
}
ans++;
}
}
}
//system("pause");
return 0;
}
解答:
這b題,硬做超時,需要找規律。
首先可以確定,最後加到a和b上的數的總和一定是n*n(+1)/2
那麼,執行的加法次數肯定是n,現在需要找到這個最小的n
這裏需要對前n項和進行觀察,如果a與b差的奇偶性與前n項和的就奇偶性相同,原因:
設a與b差的絕對值是diff,前n項和是sum。
如果diff是奇數,那麼需要將sum分割成兩部分,一部分奇數填補diff,另一部分需要是偶數,分別加到a和b上
如果diff是偶數,那麼同樣,先將diff填補,然後將剩餘的偶數分別加到a和b上即可