Triangle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1171 Accepted Submission(s): 701
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.
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
).
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
题目大意:有n跟木条,每根木棒的长度分别为:1.2.3.4.5......n.问最从中最少去掉几根木棒就能使得剩下的木棒不能组成三角形
思路:本题是一个斐波那契数列,另外,本题最多只有20根木条,可也直接用打表法
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[30]={0,0,0,0,1,1,2,3,3,4,5,6,7,7,8,9,10,11,12,13,14,15};
int main()
{
int n;
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
int n;
cin>>n;
printf("Case #%d: ",i);
cout<<a[n]<<endl;
}
}
}
用斐波那契数列求解(赛后参考的大神的,自己当时没想到……)#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);
}
}