题目链接:Problem - 1950F - Codeforces
题目大意:给定三个整数, a, b, c 。其中a是在一棵树上度为2的结点(既有左子树,右子树)的个数,b是度为1的结点的个数, c是叶子结点的个数。问这样的结点分布情况是否可以勾成一棵二叉树,如果可以,输出最小高度,不能输出-1。1<=a,b,c<=1e5, a+b+c>=1.
题目思路:该题首先判断是否可以构成一棵树,由通过不断地画二叉树可以知道,n2+1 == n0(二叉树的性质), 即题目中 a + 1 == c .接下来便是模拟构建树,便有了三种选择 先构建a, 然后b, 先b 后a, a 与 b 交叉构建。这里只有通过手玩模拟 , 可以发现 先用 a 后 b 构建出的树最小。 其实贪心的角度来想也是可以的, 如果先用 b, 则每一次的构建只能放在前一个结点的后面,树便会变高。 先用a的话 会在后面留两个 ‘ 尾巴 ’, 可以使得构建时横向发展,便会变矮。 实现过程中每一次构建要在最矮的地方进行构建, 可以使用 优先队列维护最小的值。
import heapq
from heapq import heappush
def solve() :
a, b, c = map(int, input().split())
q = list()
heapq.heappush(q,0) #采用优先队列
ans = 0
if a + 1 != c:
print(-1)
return
while a>0:
top = heapq.heappop(q)
ans = max(top + 1, ans) #维护ans
heapq.heappush(q,top+1) #有左右子树
heapq.heappush(q, top + 1)
a-=1
while b>0:
top = heapq.heappop(q)
ans = max(top+1, ans) #维护ans
heapq.heappush(q, top+1) #只有一课树
b-=1
print(ans)
T = int(input())
while T:
solve()
T-=1
欢迎大佬指正, 感谢收看与点赞。
标签:heapq,top,Tree,结点,heappush,构建,ans From: https://blog.csdn.net/king0304916/article/details/145076395