题意:两个人能比赛要求胜场差<=1 输得人淘汰不再比赛 求n(n<=1e18)个人比赛 冠军最多能赢几场
转换一下思维 令f[x]为冠军赢x场比赛时最少的参赛人数,则f[x]=f[x-1]+f[x-2] (让赢x-1场的去赢x-2场的)
输入n 二分找到n>=f[x]的最大x即可
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
typedef long long ll;
using namespace std;
const int N=1e5+20;
ll f[N];
int main()
{
f[1]=2;
f[2]=3;
int x;
for(x=3;;x++)//fib增长很快
{
f[x]=f[x-1]+f[x-2];
if(f[x]>1e18)
break;
}
int l=1,r=x,ans;
ll n;
cin>>n;
while(l<=r)
{
int mid=(l+r)/2;
if(n>=f[mid])
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
cout<<ans<<endl;
return 0;
}