ETH官方钱包

前往
大廳
主題

LeetCode - 1686. Stone Game VI 解題心得

Not In My Back Yard | 2024-05-09 12:00:12 | 巴幣 0 | 人氣 100

題目連結:


題目意譯:
Alice 和 Bob 正在玩一個遊戲,其中 Alice 是作為先手。

現在有 n 顆石頭堆成一堆。在每一位玩家的回合中,他可以從石頭堆中移除某顆石頭並得到該石頭的「價值」作為分數。Alice 和 Bob 對於每一顆石頭可能會有不同的「價值」。

你現在被給定兩個長度為 n 的整數陣列 aliceValues 和 bobValues。每一個 aliceValues[i] 和 bobValues[i] 分別代表著第 i 顆石頭對於 Alice 和 Bob 的價值。

在所有石頭都被選完之後,有著最大分數值的人將會是贏家。如果兩位玩家的分數一樣,則平手。兩位玩家都會按最佳策略遊玩且知道彼此對於各個石頭的價值。
 
決定遊戲的結果,並且:
    如果 Alice 贏,則回傳 1;
    如果 Bob 贏,則回傳 -1;
    如果平手,則回傳 0。

限制:
n == aliceValues.length == bobValues.length
1 ≦ n ≦ 10 ^ 5
1 ≦ aliceValues[i], bobValues[i] ≦ 100



範例測資:
範例 1:
輸入: aliceValues = [1,3], bobValues = [2,1]
輸出: 1
解釋:
如果 Alice 拿了 1 號石頭(索引值從 0 開始數),則 Alice 將得到 3 分。
Bob 接著只能拿 0 號石頭,且只得到 2 分。
Alice 贏。

範例 2:
輸入: aliceValues = [1,2], bobValues = [3,1]
輸出: 0
解釋:
如果 Alice 拿 0 號石頭而 Bob 拿 1 號石頭,他們各自得到 1 分。
平手。

範例 3:
輸入: aliceValues = [2,4,3], bobValues = [1,6,7]
輸出: -1
解釋:
不論 Alice 怎麼拿,Bob 都會得到比 Alice 更多的分數。
例如說,如果 Alice 拿 1 號石頭,Bob 可以拿 2 號石頭,最後 Alice 將拿走 0 號石頭。如此,Alice 會得到 6 分而 Bob 則是 7 分。
Bob 贏。


解題思維:
對於 i 號石頭而言,如果 Alice 整個遊戲中有拿到 i 號石頭,則 Alice 不只會得到 aliceValues[i] 而會「阻止」Bob 得到 bobValues[i]。因此實際上,選了 i 號石頭可以看作等價於獲得 aliceValues[i] + bobValues[i] 的分數;同理,如果不選則等價於失去 aliceValues[i] + bobValues[i] 分。

此時我們定義 S[i] = aliceValues[i] + bobValues[i]。可以看到 Alice 的最佳策略會是拿最大的 S[i],接著 Bob 會拿走次大的 S[i],再來 Alice 應拿走第三大的 S[i]……以此類推。

因此我們可以算出所有 S[i] 之後由大排到小得到一個新的陣列 S'[i],此時 S'[0] ≧ S'[1] ≧ ……。

而 Alice 的分數將會是 A = S'[0] + S'[2] + ……,而 Bob 的則會是 B = S'[1] + S'[3] + ……。如果 A > B,則 Alice 贏;如果 A < B,則 Bob 贏;若以上皆非,則平手。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作