问题在于找到使所有节点均为零所需的最小值,我们称其为K。
给出了一个非二进制数字树。
在第一步中,您可以选择一个节点作为起点。如果K大于该节点的值,则将该值更改为零,并增加相距一到两个距离的其他节点的值。请注意,一旦节点的值变为零,就不会再增加它,也不会允许与其连接的节点增加。
然后,您应该选择另一个在距离1处具有至少一个零值节点的节点,然后重复该过程
5
\
2
\
5
当我们从值5的叶子开始时,我们有
6
\
3
\
0
那么我们应该选择3;我们不能选择6,因为它在距离1中没有零节点!
7
\
0
\
0
最后,我们选择7并且K = 7,但是如果首先选择2,则我们有:
6
\
0
\
6
那么我们应该选择6;因为现在值为2的节点为零,所以连接被切断,并且通过更改值为6的节点的值,将不再发生增量!
0
\
0
\
6
所以最小K = 6
找到最大节点并从其开始(如果有多个最大节点,则选择较早的那个)
我定义一个数组,我们称其为可能的节点,然后向其中添加在步骤1中找到的节点。
可能的节点不为空时,我执行以下步骤:
a。在可能的节点中选择最大值;我们称之为 max_node
b。使 max_node 的功率为零并更新K
c。增加其父母,祖父母,子女,孙子女和兄弟姐妹(如果之前不为零)的值
d。将其非零值的父项和子项添加到可能的节点e。从可能的节点
实际上这是一个家庭作业问题,但是这种方法不正确!它给出了错误的答案并达到了超时限制。
≤3×10 5
-10 9 ≤节点的值≤10 9
时间限制:2.5秒
内存限制:256 MB
答案 0 :(得分:0)
如果您从树中的随机节点开始,则K为以下各项的最大值:
这是因为限制,您只能选择与0节点相邻的节点,并且这些节点不能递增。
我们可以得出结论,Kmin必须在max和max + 2之间。
因此O(n)算法看起来像这样:
max
并计算有多少节点具有该值=> maxCount
maxCount = 1
然后计算有多少个节点具有值max - 1
=> max1Count
,则有两种可能性:
max1Count = 0
或与值为max - 1
的节点相邻的值为max
的节点数等于max1Count
=>解为max
< / li>
max + 1
max
的所有节点:
max
第一次出现的深度只有一个节点:
max
的孩子数等于maxCount - 1
=>解为max + 1
max
的孩子,并且其值为max
的孩子数等于maxCount - 2
=>解决方案也是max + 1
max
,但是有maxCount - 1
个大子代,它们的父代和值都max
=>解决方案也是max + 1
max + 2
maxCount
个节点,并且它们都具有相同的父==,则解决方案是max + 1
max + 2