题解:UVA846 Steps

Solution

数学题,但为啥过的人这么少?

分析题意我们可以发现,其实就是让你构造一个序列使得这个序列中所有数的和为 x − y x-y xy。然后要这个序列最短。我们按照题意可以利用贪心的思想,容易发现这个序列应该是由一个非严格单调递增序列和一个非严格单调递减序列组成的。例如样例中从 45 45 45 49 49 49 距离为 4 4 4,我们可以构造序列 121 1 2 1 121 即可满足题目条件,而这个序列的长度 3 3 3 则为答案。

于是我们可以分类讨论,如果 y − x y-x yx 是一个完全平方数那么 就可以构造出一个回文的序列,例如 1234321 1 2 3 4 3 2 1 1234321。而这种情况下序列的长度也很好算,序列长度为 $ \sqrt{y-x} \times 2 -1$。

而如果 y − x y-x yx 不是完全平方数,则又有两种情况。

先举一个例子,如果 y − x = 13 y-x=13 yx=13 由于第一步和最后一步都需要是 1 1 1 故序列为 1233211 1 2 3 3 2 1 1 1233211,长度为7,而这个序列我们知道 13 = 3 \sqrt{13}=3 13 =3, 可以发现序列中的数如果两两配对,可以得到 4 4 4 3 3 3 和一个 1 1 1,由此我们可以延伸得到这种情况时序列的长度为 y − x × 2 + 1 \sqrt{y-x}\times2+1 yx ×2+1

除了上述情况外还有一种情况,如果 y − x = 12 y-x=12 yx=12,序列为 $1 2 3 3 2 1 $ ,如果 y − x = 11 y-x=11 yx=11 序列为 123221 1 2 3 2 2 1 123221。而此时序列的长度都无法使用上述两个公式求得,于是我们又得到了第三种情况。而通过整理得,这种情况需要满足 $ y-x \le \sqrt{y-x}\times(\sqrt{y-x}+1)$。

Code

#include<bits/stdc++.h>
using namespace std;
int x,y,a,b,s,t;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>x>>y;
		if(x==y)
		{
			cout<<"0\n";
			continue;
		}
		a=abs(x-y); b=sqrt(a);
		if(a==b*b)
		{
			cout<<b*2-1<<"\n";
			continue;
		}
		if( a> (b*(b+1)) )
			cout<<b*2+1<<"\n";
		else
			cout<<b*2<<"\n";
		
	}
	return 0;
}
/*
14
1 2 3 3 2 2 1

*/
/*
1 2 1 1  
*/
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值