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