【OJ】小兔蹦蹦跳Ⅰ

1710: 小兔蹦蹦跳Ⅰ

题目描述

小兔位于X轴的x点,欲跳至X轴的y点。x,y均为整数。小兔每次沿x轴直线跳跃,每跳的长度均为正整数,假设

小兔一共跳了n次才到目的地,每次跳的长度为F1,F2,…, Fn. 有规则如下:
F1=Fn=1
|Fi-Fi-1|<=1 , 2<=i<=n (注:| |是绝对值符号)
我们的问题是给定x,y, 如何使得n最小。

输入

包含多组数据,但不超过1000组。每组数据一行,每行包括两个整数x和y。0 <= x < y <= 1000000000 。

输出

对于每一组数据,输出一行,即从x到y的最小跳跃次数n。

样例输入

45 48
45 49
45 50

样例输出

3
3
4

问题分析

设输入的x与y的差值为calc,小兔需要跳的步数为result,则对于这个题目的解答:

calc = 1 ----> result = 1	----> 1
calc = 2 ----> result = 2   ----> 1 + 1
calc = 3 ----> result = 3 	----> 1 + 1 + 1
calc = 4 ----> result = 3   ----> 1 + 2 + 1
calc = 5 ----> result = 4   ----> 1 + 2 + 1 + 1
calc = 6 ----> result = 4   ----> 1 + 2 + 2 + 1
calc = 7 ----> result = 5   ----> 1 + 2 + 2 + 1 + 1
calc = 8 ----> result = 5   ----> 1 + 2 + 2 + 2 + 1
calc = 9 ----> result = 5   ----> 1 + 2 + 3 + 2 + 1
....

现在研究对于 result步,最多能够走多远,记作max

result = 1 	max = 1
result = 2  max = 2
result = 3  max = 4    1 + 2 + 1
result = 4  max = 6    1 + 2 + 2 + 1
result = 5  max = 9    1 + 2 + 3 + 2 + 1
result = 6  max = 12   1 + 2 + 3 + 3 + 2 + 1
result = 7  max = 16   1 + 2 + 3 + 4 + 3 + 2 + 1
....

所以对于result 步,最多可以走max远,计算后公式如下:

max = ((result+1)*(result+1)-1)/4 	当result为偶数时
max = ((result+1)*(result+1)/4)		当result为奇数时

接下来就是反过来,根据 calc —> max —> result

解题代码

#include <stdio.h>
#include <math.h>

/**
 *  判断x是不是平方数
 */
bool sqrted(long long x)
{
    long long temp = sqrt(x);
    return temp*temp == x;
}

// written by Smileyan
int main()
{
    long long m,n;
    while(scanf("%lld%lld",&m,&n)==2)
    {
        long long calc = n - m;
        // 一直+1,指导它成为一个平方数
        while(sqrted(calc*4+1) != true && sqrted(calc)!=true)
        {
            calc++;
        }
        long long result;

        // 简单计算
        if(sqrted(calc*4+1) == true)
            result = sqrt(calc*4+1)-1;
        else
            result = sqrt(calc*4)-1;
        printf("%lld\n",result);
    }

    return 0;
}

总结

研究规律+数学运算。

Smileyan
2019年9月25日 13:10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章