传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5914
题意:
给你n根棍,长度分别为1~n,至少删掉几根棍使得剩下的棍子里任意三根拼不成三角形?
分析:
初中时老师大大已经教过我们,三根棍,哦不,三个数能组成三角形的充要条件是最小的两边之和大于第三边。
啊啊啊,那怎么用到这道题里呢?既然任意三个数拼不成三角形,还要尽可能多的数,那就考虑下临界情况,也就是最小的两边之和等于第三边,等等。前面两个数之和等于第三个数,这是什么鬼?
没错,Fibonacci数列√
那么简单了,把不是斐波那契数的棍子都删了即可。
//source:2016中国大学生程序设计竞赛(长春)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n;
int fib[8]={1,1,2,3,5,8,13,21};
int solve() {
int i=0;
while(fib[i]<=n)
i++;
return n-i+1;
}
int main() {
scanf("%d",&t);
for(int i=1;i<=t;i++) {
scanf("%d",&n);
printf("Case #%d: %d\n", i,solve());
}
}