题目大意:
一共N个人,要进行比赛,我们现在需要达到的目的是,将最终的获胜者的参加比赛的场数最多。
比赛规则是:如果两个人的胜场数相差最对值小于等于1,这两人就可以进行一场比赛。
比赛没有平手,只有获胜。
思路:
1、首先递推出以下所有情况的正解:
人数 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
解 | 1 | 2 | 2 | 3 | 3 | 3 | 4 | 4 | 4 | 4 | 4 |
2、接下来观察到解为1的个数为1,解为2的个数为2,解为3的个数为3,解为4的个数为5.很明显的斐波那契数列,那么接下来维护一个斐波那契数列的前缀和即可。
(预处理到95即可)
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
ll f[100];
void init()
{
memset(f,0,sizeof(f));
f[1]=1;
f[2]=2;
for(int i=3;i<=95;i++)
{
f[i]=f[i-1]+f[i-2];
}
for(int i=1;i<=95;i++)
{
f[i]=f[i-1]+f[i];
}
}
int main()
{
init();
ll n;
while(~scanf("%I64d",&n))
{
n-=2;
for(int i=1;i<=95;i++)
{
if(f[i]>n)
{
printf("%d\n",i);
break;
}
}
}
}