繁体   English   中英

通过在每一步增加相邻节点,找到使所有树节点为零所需的最小值

[英]Find minimum value needed to make all tree nodes zero by incrementing asjacent nodes at each step

  1. 问题在于找到使所有节点为零所需的最小值,我们称其为K。

  2. 给出了一个非二进制数字树。

  3. 在第一步中,您可以选择一个节点作为起点。 如果K大于该节点的值,则将该值更改为零,并增加相距一到两个距离的其他节点的值。 请注意,一旦节点的值变为零,就不会再增加它,也不会允许与其连接的节点增加。

  4. 然后,您应该选择另一个在距离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. 找到最大节点并从中开始(如果有多个最大节点,则选择较早的那个)

  2. 我定义了一个数组,我们将其称为可能的节点 ,然后向其中添加在步骤1中找到的节点。

  3. 可能的节点不为空时,我执行以下步骤:

    一种。 在可能的节点中选择最大值; 我们称之为max_node

    使max_node功率为零并更新K

    C。 增加其父母,祖父母,子女,孙子女和兄弟姐妹的价值(如果之前不为零)

    d。 将其非零值的父项和子项添加到可能的节点

    可能的节点中删除max_node

实际上这是一个作业问题,但是这种方法不是正确的方法! 它给出错误的答案并达到超时限制。

约束

  • 节点数≤3×10 5

  • 节点-10 9≤值≤10 9

  • 时间限制:2.5秒

  • 内存限制:256 MB

如果从树中的随机节点开始,则K为以下各项的最大值:

  1. 起始节点
  2. 它的孩子+1
  3. 其父+ 1
  4. 所有其他节点+ 2

这是因为限制,您只能选择与0节点相邻的节点,并且这些节点不能递增。

我们可以得出结论,Kmin必须在max和max + 2之间。

因此,O(n)算法可能如下所示:

  1. 找到最大节点值max并计算有多少节点具有该值=> maxCount
  2. 如果maxCount = 1则计算有多少个节点的值max - 1 => max1Count ,有两种可能性:
    1. max1Count = 0或值的相邻节点的数量max - 1与值的节点max等于max1Count =>该解决方案是max
    2. 否则解为max + 1
  3. 找到树中最高的所有具有max的节点:
    1. 如果在max的第一次出现的深度处仅找到一个节点:
      1. 值为max的子maxCount - 1等于maxCount - 1 =>解为max + 1
      2. 只有一个孩子值max和其子与值的计数max等于maxCount - 2 =>该解决方案是max + 1
      3. 没有子项具有max值,但是有maxCount - 1它们都具有相同的父级,并且值max =>解决方案也是max + 1
      4. 否则解决方案为max + 2
    2. 如果找到了maxCount节点并且它们都具有相同的父节点=>解决方案为max + 1
    3. 否则解决方案为max + 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM