题意很简单,给定两个数a,b,问从a到b,需要的最小步数。且要求第一步和最后一步的距离为1,其余的步数和前一步最多相差1(即大于,等于,或小于前一步1)
解决方法:
1. 从a,b两边开始依次走,step(步数)依次增加,同时走向中间;
2. 在即将中间时,分情况讨论。
代码如下:
#include<stdio.h>
int main()
{
int n,a,b;
int cnt,step;
scanf("%d",&n);
for(int k=0;k<n;k++)
{
scanf("%d %d",&a,&b);
cnt=0;step=1;
while(1)
{
if(a>=b) { printf("%d\n",2*cnt);break;}
else if((b-a)>0&&(b-a)<=step) { printf("%d\n",2*cnt+1);break;}
else
{
a+=step;
b-=step;
cnt++;
step++;
}
}
}
return 0;
}
分析如下:
当从两边(左边为a,右边为b)同时向中间走,走到0<(b-a)<=step(此时的步数大小)时,只有(b-a)没走完,此时已经走了2*cnt步(因为两边,所以乘2)
假设step=n, (b-a)=step-1=n-1,我们可以想象将这一步平移到右边对应距离,如下图。
其他情况类似。因此当0<(b-a)<=step,总步数=2*cnt+1