1461: 天坑的绳子
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 105 Solved: 61
[ Submit][ Status][ Web Board]
Description
天坑有一条长度为n的绳子,天坑想要把这条绳子切成尽可能多的段,并且每段的长度必须为大于等于1的整数而且任意三段绳子都不能组成三角形。请问最多能切几段?
Input
测试文件的第一行有一个正整数T,代表一共有T组测试数据。
每组测试数据的第一行为一个正整数n(1<=n<=100000000)。
Output
对于每组测试数据,输出对应的答案。
Sample Input
3
1
2
4
1
2
4
Sample Output
1
2
3
解题思路:由于题目要求的是最多的绳子段数,且任意三段都不能构成三角形,又因为构成三角形的条件可以为任意两边之和大于第三边。由此联想到斐波那契数列,前两项的和等于第三项。正好不能构成三角形,且又是分的最细的。因此,只要用绳子的长度不断减去数列的项,直到绳子没有为止。
解题心得:在比赛的时候,丝毫没有思路,也没有联想到斐波那契数列,也是在同学的指导下完成的。
ac代码:
希望能帮到你们~
2
3
解题思路:由于题目要求的是最多的绳子段数,且任意三段都不能构成三角形,又因为构成三角形的条件可以为任意两边之和大于第三边。由此联想到斐波那契数列,前两项的和等于第三项。正好不能构成三角形,且又是分的最细的。因此,只要用绳子的长度不断减去数列的项,直到绳子没有为止。
解题心得:在比赛的时候,丝毫没有思路,也没有联想到斐波那契数列,也是在同学的指导下完成的。
ac代码:
#include <iostream>
#include<cstdio>
using namespace std;
int t,n,a[105],counts;
int main()
{
scanf("%d",&t);
a[0]=1;
a[1]=1;
for(int i=2;i<=100;i++)
{
a[i]=a[i-1]+a[i-2];
}
while(t--)
{
scanf("%d",&n);
counts=0;
for(int i=0;i<100;i++)
{
if(n-a[i]<0)
{
break;
}
n=n-a[i];
counts++;
}
printf("%d\n",counts);
}
return 0;
}
希望能帮到你们~