uva 846

题意:在给出的两个数A,B,找出最少需要几步可以从A到B,规则:第一步和最后一步必须是1,还有中途只可以比前一数大一,等于,或小一。。

第一种方法:从A,B开始依次加,然后距离减去步长,直到 dis<0 ,我们可以肯定的是,小于零的这部分C,一定小于当前的步长N,所以我们一定能在之前的步长中找到(N-C),也就可以填满这一部分。。。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int n;

int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        int dis = b - a ;
        bool flag = false ;
        int count = 0 ;
        int step = 1 ;
        while (dis > 0 )
        {
            dis -= step;
            count++;
            if (flag)
                step++;
            flag = !flag;
        }
        printf("%d\n",count);
    }
    return 0;

第二种方法:1+2+.....+(n-1)+n+(n-1)+....2+1 =n^2,这是我们在达到和为n^2在满足题意的情况下能确定的最少步数,设想我们如果 dis==n^2 ,那结果就显而易见了,当dis > n^2的时候,首先我们先确定最大的n满足 n^2 <= dis ,然后我们只要再找dis-n^2的数就可以,如果dis-n^2<=n,那只要再找一个,如果>n,但我们发现这个数一定<(n+1)^2-n^2

,那这个数一定可以化为数列中的两个数。。。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
    int t ;
    scanf("%d",&t);
    while (t--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        int dis = b - a ;
        if (dis <= 3)
            printf("%d\n",dis);
        else
        {
            
            int n = sqrt(dis);
            if ( n * n == dis)
                printf("%d\n",2*n-1);
            else if ((dis-n*n)<=n)
                printf("%d\n",2*n);
            else  printf("%d\n",2*n+1);
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值