#41487: C++詳解


toseanlin@gmail.com (Dr. SeanXD)

學校 : 康橋雙語學校
編號 : 158065
來源 : [24.147.249.5]
最後登入時間 :
2024-10-28 09:54:40
g309. pC. 傳遞杯子蛋糕(Cupcake) -- 110學年度hgsh校內賽 | From: [220.136.106.229] | 發表日期 : 2024-07-31 09:13

可以宣告一個 map<int, pair<int, int>> MAP 來紀錄每一個節點的左右節點是什麼,並且宣告一個 map<int, int>ans 來存答案。

跑一個 DFS,需要的參數是目前要分的蛋糕數量 cake 和目前的節點位置 pos。預設一個變數 split 為 1,代表需要分蛋糕給多少人,如果 MAP[pos].first != -1,代表左邊有人,所以 split++,同樣如果 MAP[pos].second != -1 就代表右邊有人,所以一樣要 split++。如果 split == 1 ,代表已經不會繼續往下走了,將 ans[pos] 設為 cake 並且 return。

如果 DFS 要繼續往下走,則宣告一個變數 divide 為 cake/split,並且先將 ans[pos] 設為 divide。如果 cake % split != 0,則要將多餘的分給目前位置,所以要 ans[pos] += cake % split。

如果目前位置左邊有節點的話就呼叫 DFS,只是蛋糕數量變成 divide,並且目前位置變成 MAP[pos].first,相同道理也用在右邊。

最後跑一個 For迴圈,從 1 到 N-1,將 ans 中的資料輸出。

 

範例程式碼

 
ZeroJudge Forum