Triangle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 388 Accepted Submission(s): 263
Problem Description
Mr. Frog has n sticks, whose lengths are 1,2, 3⋯n respectively. Wallice is a bad man, so he does not want Mr. Frog to form a triangle with three of the sticks here. He decides to steal some sticks! Output the minimal number of sticks he should steal so that Mr. Frog cannot form a triangle with
any three of the remaining sticks.
Input
The first line contains only one integer T (T≤20), which indicates the number of test cases.
For each test case, there is only one line describing the given integer n (1≤n≤20).
Output
For each test case, output one line “Case #x: y”, where x is the case number (starting from 1), y is the minimal number of sticks Wallice should steal.
Sample Input
3
4
5
6
Sample Output
Case #1: 1
Case #2: 1
Case #3: 2
Source
题目大意:
一共给你N根木棒,其中每根木棒的长度分别为:1.2.3.4.5......N.问最少去掉几根木棒就能使得剩下的木棒不能组成三角形。
思路:
这个题和Bestcoder #71 (Div.2)A KK's Steel有异曲同工之妙。hdu 5620:
其官方题解:
辣么本题可以沿用这样的思想:
求出前几项斐波那契数列的数,然后统计有多少个斐波那契数小于等于n,记tmp,表示最多剩下的木棒数,然后因为要求输出的是去掉多少根,那么输出n-tmp即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int f[50];
void init()
{
f[1]=1;
f[2]=2;
for(int i=3;i<=20;i++)
{
f[i]=f[i-1]+f[i-2];
}
}
int main()
{
int t;
int kase=0;
init();
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int tmp=0;
for(int i=1;i<=20;i++)
{
if(f[i]<=n)tmp++;
}
printf("Case #%d: ",++kase);
printf("%d\n",n-tmp);
}
}