[CF735C] Tennis Championship

Description

有一个 $ n $ 个节点的二叉树。
要求每个节点的两个儿子的子树最大深度相差不超 $ 1 $,求最大深度。
$ n <= 10^{18} $

Solution

倒过来想,设 (f(x)) 表示深度为 (x) 的这样的二叉树,最少需要多少个点

显然有 (f(x)=f(x-1)+f(x-2))

边界条件 (f(0)=1,f(1)=2) (由题意引发的数值偏移)

于是我们递推出 Fib 数列即可

#include <bits/stdc++.h>
using namespace std;

#define int long long

int n;

signed main() {
    cin>>n;
    int a=1,b=1;
    for(int i=1;i<=n;i++) {
        int t=b; b=a+b; a=t;
        if(b>n) {
            cout<<i-1;
            break;
        }
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/12808513.html