平衡二叉树

平衡二叉树

https://ac.nowcoder.com/acm/problem/19775

通过这题发现了double的坑点,本来认为double表示范围可能跟long long差不了多少,在wa了n次之后发现double表示的长度是16位,而2的60次方已经到了18位的长度了,当然不对,所以这题不能图省劲直接用powhan's
题解:
这题就是让我们算这颗树最不平衡的时候根节点左右子数结点的差,所以我们让一颗树满结点,另一棵树是最少结点的个数即可算出,满结点的树可以一下算出结点个数,呢么怎么算那一颗不满结点的树呢?
我们可以从上往下推
公式dp[i]=dp[i-1]+dp[i-d-1]+1
dp[i]表示深度为i的子树最少总节点个数
意思就是在深度为i的结点是由左子树深度(i-1)和右子树(i-d-1)这两棵树组成的
代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 110;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;

ll dp[maxn];
int main(){
    int n,d;
    cin>>n>>d;
    ll ans=1;
    for(int i=0;i<n-1;i++) ans*=2;
    ans=ans-1;
    dp[1]=1;
    for(int i=2;i<=n;i++){
        if(i>d) dp[i]=dp[i-1]+dp[i-d-1]+1;
        else dp[i]=dp[i-1]+1;
    }
    cout<<dp[max(n-d-1,0)]<<endl;
    return 0;
}
题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务