Solution
数学题,但为啥过的人这么少?
分析题意我们可以发现,其实就是让你构造一个序列使得这个序列中所有数的和为 x − y x-y x−y。然后要这个序列最短。我们按照题意可以利用贪心的思想,容易发现这个序列应该是由一个非严格单调递增序列和一个非严格单调递减序列组成的。例如样例中从 45 45 45 到 49 49 49 距离为 4 4 4,我们可以构造序列 121 1 2 1 121 即可满足题目条件,而这个序列的长度 3 3 3 则为答案。
于是我们可以分类讨论,如果 y − x y-x y−x 是一个完全平方数那么 就可以构造出一个回文的序列,例如 1234321 1 2 3 4 3 2 1 1234321。而这种情况下序列的长度也很好算,序列长度为 $ \sqrt{y-x} \times 2 -1$。
而如果 y − x y-x y−x 不是完全平方数,则又有两种情况。
先举一个例子,如果 y − x = 13 y-x=13 y−x=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 y−x×2+1。
除了上述情况外还有一种情况,如果 y − x = 12 y-x=12 y−x=12,序列为 $1 2 3 3 2 1 $ ,如果 y − x = 11 y-x=11 y−x=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
*/