平衡二叉树
平衡二叉树
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; }
题解 文章被收录于专栏
主要写一些题目的题解