嵊州D1T3
睡美人航班
不知不觉中,我对她的爱意已经达到了 n。
是这样子的,第 1 分钟,我对她的爱意值是 (1, 1)。
假如当第 x 分钟时我对她的爱意值是 (a, b),那么第 x + 1 分钟我对她的爱意值就是 (a + b, b) 或者 (a, a + b)。
在关注着她的时候,我已然忘记了时间。
现在我想知道,这时候航班已经至少起飞了多久?
爱意为 n,也就是说 a + b = n。
Input
一行一个整数 n。
Output
一行一个整数表示答案。
Examples
sleepingbeauty.in | sleepingbeauty.out |
5 | 3 |
Notes
对于所有数据,满足 2 ≤ n ≤ 106
Task1[30%]
n ≤ 20
Task2[50%]
n ≤ 103
Task3[70%]
n ≤ 104
Task4[100%]
无特殊限制
solve!
这道题题挺简单的(虽然我没做出来)
没事!这不是最后的考试,我也还有机会!
看一眼题,先定义个gcd(a,b)再说
第二,那个灵力值的大小不重要,重要的是:
1、起始值
2、每个梦都要做(才能知道最多的事情嘛)
(好贪心哟(^U^)ノ~YO)
#include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f; int n,a=0,b=0,nowtime=1,mintime=inf; int ay(int a,int b) { if(b) return ay(b,a%b)+a/b; else if(a>1) return inf; else return -1; } int main() { //freopen("sleepingbeauty.in","r",stdin); //freopen("sleepingbeauty.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) mintime=min(mintime,ay(n,i)); printf("%d",mintime); return 0; } /* 另一种方法 ay(){ if(a+b>n) return; nowtime++; if(a+b==n) mintime=min(mintime,nowtime); ay(a+b,b); ay(a,a+b); nowtime--; */
有一点我好傻:
if(b)
return ay(b,a%b)+a/b;
else
if(a>1) return inf;
else return -1;
其实可以很简单的用两个三目运算符的。。。
return b ? ay(b, a % b) + a / b : a > 1 ? inf : -1;
有的时候要相信自己嘛!
运行通过,再看看数据也没有什么特别大的。行吧!