【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

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