1. 程式人生 > 實用技巧 >20.8.24 周賽 5496. 你可以獲得的最大硬幣數目 中等

20.8.24 周賽 5496. 你可以獲得的最大硬幣數目 中等

題目

有 3n 堆數目不一的硬幣,你和你的朋友們打算按以下方式分硬幣:

每一輪中,你將會選出 任意 3 堆硬幣(不一定連續)。
Alice 將會取走硬幣數量最多的那一堆。
你將會取走硬幣數量第二多的那一堆。
Bob 將會取走最後一堆。
重複這個過程,直到沒有更多硬幣。
給你一個整數陣列 piles ,其中 piles[i] 是第 i 堆中硬幣的數目。

返回你可以獲得的最大硬幣數目。

示例 1:

輸入:piles = [2,4,1,2,7,8]
輸出:9
解釋:選出 (2, 7, 8) ,Alice 取走 8 枚硬幣的那堆,你取走 7 枚硬幣的那堆,Bob 取走最後一堆。
選出 (1, 2, 4) , Alice 取走 4 枚硬幣的那堆,你取走 2 枚硬幣的那堆,Bob 取走最後一堆。
你可以獲得的最大硬幣數目:7 + 2 = 9.
考慮另外一種情況,如果選出的是 (1, 2, 8) 和 (2, 4, 7) ,你就只能得到 2 + 4 = 6 枚硬幣,這不是最優解。
示例 2:

輸入:piles = [2,4,5]
輸出:4
示例 3:

輸入:piles = [9,8,7,6,5,1,2,3,4]
輸出:18

提示:

3 <= piles.length <= 10^5
piles.length % 3 == 0
1 <= piles[i] <= 10^4

思路

  1. 因為看到10^5,大概率陣列只能遍歷一次
  2. 最優情況就是,Bob把全部最少的拿完,我儘量拿到最多的,那麼就想到先把陣列排序了
  3. Bob拿最少的,那就從陣列左邊開始拿
  4. 我儘量拿最多的,即儘量拿當前第二多的硬幣,所以從陣列右邊開始拿

程式碼

class Solution {
public:
    int maxCoins(vector<int>& piles) {
        int res=0;
        sort(piles.begin(), piles.end());
        for(int i = 0, j = piles.size()-1; i < piles.size()/3; i++, j-=2){
            res+=piles[j-1];
        }
        return res;
    }   
};