题目描述
牛牛有一根长度为a(3≤a≤1e18)的木棒,现在牛牛想将木棒分成一些段(每段木棒长度必须为整数),使得分隔后的木棍中,任意三段都不能构成三角形,牛牛想知道木棒最多被分成几段呢?
实例
输入
5
输出
3
题目解析
这道题就是一道斐波那契数列的变种题,对于木棒怎么分割,我们只要考虑相邻的三个构不成三角形,其他方法也必然不能构成三角形。
上述样例5,按照斐波那契数列来说是1 1 2,
但是还剩下1,满足不了下一个数(3),
所以我们将剩余的1,加入到前一个2中,得到序列1 1 3既是答案。
AC代码
public static int stick (long a) {
// write code here
if(a == 3) {
return 2;
}
if(a == 4) {
return 3;
}
int ans = 2;
a -= 2;
long x1 = 1;
long x2 = 1;
while(true){
long cur = x1+x2;
if(a >= cur){
a -= cur;
} else {
break;
}
ans++;
if(a == 0) {
break;
}
x1 = x2;
x2 = cur;
}
return ans;
}