顯然的貪心題。
首先,如果一條蛇吃了蛇之後自己不是最弱的,一定會吃。
證明:假設蛇的實力陣列 \(a\) 單調遞增,一共還剩 \(k\) 條蛇。
顯然有 \(a_{k-1}-a_2<a_k-a_1\),也就是說,無論如何吃了之後都不會變成最弱蛇,所以一定吃。
然後考慮吃了之後會變成最弱蛇的情況。
首先來看 2023 年天元公學邀請賽的一道初賽題:
有 \(n\) 只青蛙,\(1\) 只天鵝,每隻青蛙按編號依次選擇吃或不吃天鵝,如果吃了,自己將變成天鵝,否則無事發生,遊戲結束。假設青蛙足夠聰明,問當 \(n\) 為下列選項中哪一個數時,天鵝會被吃掉。
A.4 B.6 C.9 D.12
我們發現這道題和吃了之後會變成最弱蛇的情況有異曲同工之處。我們不妨用歸納法來做一做這道初賽題。
首先,如果只有一隻青蛙,肯定吃。
如果有兩隻青蛙,第一隻青蛙吃了之後就變成了一隻青蛙的狀態,就導致第一隻青蛙會被吃掉,所以第一隻青蛙不會吃。
如果有三隻青蛙,第一隻青蛙會吃,因為如果吃了之後,第二隻青蛙不會選擇吃掉天鵝(因為如果選擇吃自己會被吃掉),所以第一隻青蛙會吃。
至此,我們的結論就出來了,當 \(n \equiv 1 \pmod 2\) 時,天鵝會被吃掉,否則不會被吃。並且最多隻吃一輪。
那麼我們只要模擬一下,就能決定吃或不吃了。
現在的問題是,如何維護陣列有序。
用堆複雜度太高,無法獲得滿分。於是我們用雙端佇列進行構造,會發現可以簡單的維護有序性。然後就變成了線性,可以透過。