题目链接:这里
题意:一个选手只能和一个比赛次数与他的比赛次数的差的绝对值不超过一的人比赛,求冠军最多能进行多少把比赛。
解法:不要只往人数上想,可以往场数上想:
赢 1 把: 至少要 2 个人:
2把: 3个人,
3把:至少为 至少2把的人数+至少1把的人数。
4把:至少为 至少3把的+ 至少2把的(因为比赛次数差不能超过1)。
i 把:dp[i-1]+dp[i-2];
抽象一下就是:
dp[i]表示比赛i场最多需要多少个人。
那么显然dp[i] = dp[i-1] + dp[i-2]。
然后FIB递推就好了。
//CF 735C
#include <bits/stdc++.h>
using namespace std;
long long n;
long long ans = 0;
int main()
{
scanf("%lld", &n);
long long a = 2, b = 1, c;
while(1){
if(a > n) break;
ans++;
c = a;
a = a + b;
b = c;
}
printf("%lld\n", ans);
return 0;
}