UVa_846 - Steps

题意很简单,给定两个数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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值