簡體   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