cf Educational Codeforces Round 78 B. A and B

原題:

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上即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章