UVa 846 步数

/*

* 解题思路:

* 这题就是找规律题:

* 由下找规律知序号1 -> 1

*                                      4 -> 1 2 1

*                                      9 -> 1 2 3 2 1

*                                    16 -> 1 2 3 4 3 2 1

*                                          ..........( 每行数位差2!! )

*         可以看出规律来吧,最中间那个数是前面序号的开方,然后根据观察可以发现,

*

*         在序号4~9间,共有5个数,前面两个4位,后面3个5位

*          在序号9~16间,共有7个数,前面三个6位,后面4个7位

*

*          可以推出规律:假设一个区间里有n个数字 ,前 n / 2个数为一种数位,n-n/2个数为后一种数位,

*          刚好为1,4,9,16...这样的数位为( sqrt( 序号 )*2 -1 )(等差数列)个数位,

*/

1:  1
2   1 1
3   1 1 1
4:  1 2 1 
5   1 2 1 1
6   1 2 2 1
7   1 2 2 1 1
8   1 2 2 2 1
9:  1 2 3 2 1
10  1 2 3 2 1 1
11  1 2 3 2 2 1
12  1 2 3 3 2 1
13  1 2 3 3 2 1 1
14  1 2 3 3 2 2 1
15  1 2 3 3 3 2 1
16: 1 2 3 4 3 2 1

#include <math.h>
#include <stdio.h>
int main( )
{
    int t,x,y,num,tmp,m,n;

    scanf("%d",&t);
    while( t-- )
    {
        scanf("%d%d",&x,&y );
        num = y-x;
        if( !num )
            printf("0\n");
        else
        {
            tmp = sqrt( num );
            n = pow(tmp , 2 );
            m = ( pow( tmp+1 , 2 )-pow(tmp , 2 ) )/2;
    
            if( num-n > m )
                printf("%d\n",2*( tmp+1 )-1 );
            else if( num-n == 0  )
                printf("%d\n",2*tmp-1);
            else
                printf("%d\n",2*tmp);
        }
    }
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值