题目:
在迷迷糊糊的大草原上,小红捡到了n根木棍,第i根木棍的长度为i,小红现在很开心。
她想选出其中的三根木棍组成美丽的三角形。
但是小明想捉弄小红,想去掉一些木棍,使得小红任意选三根木棍都不能组成三角形。
请问小明最少去掉多少根木棍呢?
输入
本题包含若干组测试数据。
对于每一组测试数据。
第一行一个n,表示木棍的数量。
满足 1<=n<=100000
输出
输出最少数量
样例输入
4
样例输出
在迷迷糊糊的大草原上,小红捡到了n根木棍,第i根木棍的长度为i,小红现在很开心。
她想选出其中的三根木棍组成美丽的三角形。
但是小明想捉弄小红,想去掉一些木棍,使得小红任意选三根木棍都不能组成三角形。
请问小明最少去掉多少根木棍呢?
输入
本题包含若干组测试数据。
对于每一组测试数据。
第一行一个n,表示木棍的数量。
满足 1<=n<=100000
输出
输出最少数量
样例输入
4
样例输出
1
解法:其实考察的是斐波那契数列,f(n)=f(n-1)+f(n-2)的时候刚好不能凑成三角形,也就是说,考虑可以留下来的木棍的数量为
1 2 3 5 8 13 21...这个时候,任意后边的两个数相加不会大于前边的数,这个时候可以保证没有三角形。
int main()
{
while(1)
{
int m,n=0;
cin >> m;
if (m < 4)
{
cout << 0 << endl;
continue;
}
vector<int> zla = { 1,2 };
for (int i = 0; ; i++)
{
n=zla[i] + zla[i + 1];
if (n <= m)
zla.push_back(n);
else
break;
}
cout << m - zla.size() << endl;
}
return 0;
}