列表

详情


NC19775. 平衡二叉树

描述

平衡二叉树,顾名思义就是一棵“平衡”的二叉树。在这道题中,“平衡”的定义为,对于树中任意一个节点,都满足左右子树的高度差不超过 d. 空树的高度定义为0,单个节点的高度为1,其他情况下树的高度定义为根节点左右子树高度最大值 + 1. 一棵在高度上平衡的树,节点数可能不平衡,因此再定义一棵树的不平衡度为这棵树中所有节点的左右子树的节点数之差的最大值。
给定平衡的定义参数d, 你需要求出所有高度为 n 的平衡树中不平衡度的最大值。

输入描述

两个整数,n, d.

输出描述

一个整数:所有高度为 n 的平衡树中不平衡度的最大值。

示例1

输入:

4 1

输出:

5

说明:

下面这棵树在 d=1 的定义下高度是平衡的,其不平衡度为 5。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 87ms, 内存消耗: 48836K, 提交时间: 2022-09-07 22:21:46

import math
n, d = map(int, input().split())
f = [0] * 1005
f[1] = 1
for i in range(2, n - d):
    f[i] = f[i - 1] + 1
    if i >= d + 1:
        f[i] += f[i - d - 1]
print(int((1 << n - 1) - 1 - f[n - d - 1]))

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 472K, 提交时间: 2018-10-02 15:58:24

#include<cstdio>
long long n,d,dp[130];
int main(){
	scanf("%lld%lld",&n,&d);
	for(int i=n-d-1;i>=1;i--)dp[i]=dp[i+1]+dp[i+d+1]+1;
	printf("%lld\n",(1ll<<(n-1))-1-dp[1]);
	return 0;
}

Python3 解法, 执行用时: 44ms, 内存消耗: 4516K, 提交时间: 2022-11-16 00:37:50

n, d = map(int,input().split())
f=[0 for i in range(140)]
f[1]=1
for i in range(2, n+1):
    f[i] = 1 + f[i - 1] + f[i - d - 1]
print((1 << n - 1) - 1 - f[n - d - 1])

上一题