題目連結:
題目意譯:
現在有 3n 堆大小不同的金幣堆,你和你的朋友將會按照以下方式拿走金幣堆:
在每一步中,你將會選擇任 3 堆金幣堆(不一定連續)、
在你的選擇之中,Alice 將會挑走金幣最多的一堆、
接著,你將會挑剩下的金幣最多的一堆、
你的朋友 Bob 將會挑走最後剩下的那一堆、
重複以上步驟直到沒有金幣堆剩下。
給定一整數陣列 piles,其中 piles[i] 為第 i 堆的金幣數。
回傳你可以得到的最大金幣數。
限制:
3 ≦ piles.length ≦ 10 ^ 5
piles.length % 3 == 0
1 ≦ piles[i] ≦ 10 ^ 4
範例測資:
範例 1:
輸入: piles = [2,4,1,2,7,8]
輸出: 9
解釋: 選擇三元組 (2, 7, 8),Alice 將挑走有 8 個金幣的那一堆,你則將挑走有 7 個金幣的那一堆,而 Bob 則是挑走最後剩下的那一堆。
選擇三元組 (2, 7, 8),Alice 將挑走有 4 個金幣的那一堆,你則將挑走有 2 個金幣的那一堆,而 Bob 則是挑走最後剩下的那一堆。
你能得到的最大金幣數為:7 + 2 = 9。
在另一種可能性中,如果我們選擇 (1, 2, 8) 和 (2, 4, 7) ,你將只得到 2 + 4 個金幣。而這不是最佳解。
範例 2:
輸入: piles = [2,4,5]
輸出: 4
範例 3:
輸入: piles = [9,8,7,6,5,1,2,3,4]
輸出: 18
解題思維:
可以看到 Bob 每次都只會拿到最小金幣數的那一堆,因此我們以直接讓 Bob 在每一回合中都拿到剩下的「全部」金幣堆中金幣最少者。
所以我們可以直接把 piles 排序之後,直接將金幣最少的那 n 堆直接分給 Bob。
接著由於 Alice 每次都會拿最大的,因此要最大化我們能拿的金幣數,我們需要每一回合挑剩下的金幣堆中最大的兩堆(記住第三堆已經在前面先行分配給 Bob 了)。此時 Alice 會拿走當前金幣數量最大值,而我們將拿走次大值。重複此步驟 n 回合即可以得到我們能得到的最大金幣數。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。