Triangle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2113 Accepted Submission(s): 1205
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
Source
Recommend
wange2014
给了n个线段长度从1到n。问从中最少取走多少个线段能使得剩下的任意三个线段不能组成一个三角形。
思路:
三角形的的必要条件是两边之和大于第三边。而充分必要的话可以是最小的两条边加起来大于第三条边。所以构造的思路就出来了。我们用最小的两条边加起来得到第三条边的长度,这样就能刚好满足这三条边不能构成一个三角形。
所以其实就是一个斐波那切数列。
我们把斐波那切数列里面的数记录下来,从1-n遍历一次,发现不是其数列里面的数就把它剔除,记录一下就行了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
map<int,int>mp;
int main()
{
int f[20],t,n,cas=1;
f[0]=1;
f[1]=1;
mp[1]++;
for(int i=2;i<=7;i++)
{
f[i]=f[i-1]+f[i-2];
mp[f[i]]++;
}
/*f[2]=2;
f[3]=3;
f[4]=5;
f[5]=8;
f[6]=11;
f[7]=19;
int t,n;*/
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int ans=0;
for(int i=1;i<=n;i++)
{
if(mp[i]==0)
ans++;
}
printf("Case #%d: %d\n",cas++,ans);
}
return 0;
}