NOIP2024集訓Day65 貪心

Leirt_Abu發表於2024-10-31

NOIP2024集訓Day65 貪心


A. [NOI2015] 荷馬史詩

簡化題意,即構造一顆 \(k\) 叉樹,每個節點的權值為其所有孩子的權值之和,給定的 \(n\) 個數必須使用,其餘空缺處用 \(0\) 補全。

考慮使用優先佇列,首先彈入 \(n + (n-1) \% (k-1)\) 個元素(不足處用 0 代替),然後每次彈出前 \(k\) 小的數並插入其和,直到優先佇列中只剩餘一個元素。計算時同時儲存深度。

由於優先佇列預設從大到小排序, 而用 pair 比較方便, 所以處理時我們將佇列中的數取反,計算結果時再次取相反數。


B. [CCO2020] Exercise Deadlines

題目可以轉化成:構造一個排列,滿足 \(p_i≤d_i\),要求 \(p\) 逆序對個數儘可能少。

直接貪心,從後往前貪心取沒有被取的數且 \(\le d_i\) 中最大的。容易證明取更小的會使逆序對個數增加,並且更不容易合法。

最後再求一遍逆序對個數,複雜度 \(\Theta(n\log n)\)


D. [HNOI2015] 菜餚製作

如果用一個小根堆來維護拓撲的話顯然是不行的,因為這樣求出來的是字典序最小的拓撲序,並不一定是 \(1\) 儘可能在前,因為字典序是貪心的,如果前面的一位能小就儘可能的小,並不保證 \(1\) 出現儘量靠前。

但是如果建一個反圖,求一個反向字典序最大的拓撲序,那就會有大的數儘量靠前的情況出現,於是較小的數儘量靠後,於是反過來就是較小的數儘量靠前了。

所以反著建圖,用大根堆維護,然後反向輸出就好了。


相關文章