Skip to content

Latest commit

 

History

History

1962

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

You are given a 0-indexed integer array piles, where piles[i] represents the number of stones in the ith pile, and an integer k. You should apply the following operation exactly k times:

  • Choose any piles[i] and remove floor(piles[i] / 2) stones from it.

Notice that you can apply the operation on the same pile more than once.

Return the minimum possible total number of stones remaining after applying the k operations.

floor(x) is the greatest integer that is smaller than or equal to x (i.e., rounds x down).

 

Example 1:

Input: piles = [5,4,9], k = 2
Output: 12
Explanation: Steps of a possible scenario are:
- Apply the operation on pile 2. The resulting piles are [5,4,5].
- Apply the operation on pile 0. The resulting piles are [3,4,5].
The total number of stones in [3,4,5] is 12.

Example 2:

Input: piles = [4,3,6,7], k = 3
Output: 12
Explanation: Steps of a possible scenario are:
- Apply the operation on pile 3. The resulting piles are [4,3,3,7].
- Apply the operation on pile 4. The resulting piles are [4,3,3,4].
- Apply the operation on pile 0. The resulting piles are [2,3,3,4].
The total number of stones in [2,3,3,4] is 12.

 

Constraints:

  • 1 <= piles.length <= 105
  • 1 <= piles[i] <= 104
  • 1 <= k <= 105

Solution 2. Greedy + Max Heap

Intuition: We greedily remove stones from the largest pile repetitively.

Algorithm: Use a max heap pq to store the values. Keep popping the heap top (say n), remove n / 2 stones, and push n - n / 2 back to the heap, repeating k times. The answer is the sum of piles minus the sum of all stones removed.

// OJ: https://leetcode.com/problems/remove-stones-to-minimize-the-total/
// Author: github.com/lzl124631x
// Time: O((N + K) * logN)
// Space: O(N)
class Solution {
public:
    int minStoneSum(vector<int>& A, int k) {
        priority_queue<int> pq;
        for (int n : A) pq.push(n);
        long rm = 0, sum = accumulate(begin(A), end(A), 0L);
        for (int i = 0; i < k; ++i) {
            int n = pq.top();
            pq.pop();
            if (n == 1) break;
            rm += n / 2;
            pq.push(n - n / 2);
        }
        return sum - rm;
    }
};