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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值