题目链接


Python3
方法: 贪心 + 最大堆 ⟮O(k×logn+n)、O(n)⟯
class Solution:
def minStoneSum(self, piles: List[int], k: int) -> int:
heap = [-pile for pile in piles]
heapify(heap)
for _ in range(k):
pile = -heappop(heap)
pile = pile - pile//2
heappush(heap, -pile)
return -sum(heap)

C++
方法: 贪心 + 最大堆 ⟮O(k×logn+n)、O(n)⟯
class Solution {
public:
int minStoneSum(vector<int>& piles, int k) {
make_heap(piles.begin(), piles.end());
for (int i = 0; i < k; ++i){
pop_heap(piles.begin(), piles.end());
piles.back() -= piles.back()/2;
push_heap(piles.begin(), piles.end());
}
return reduce(piles.begin(), piles.end(), 0);
}
};
class Solution {
public:
int minStoneSum(vector<int>& piles, int k) {
priority_queue<int> pq(piles.begin(), piles.end());
for (int i = 0; i < k; ++i){
int pile = pq.top();
pq.pop();
pile -= pile / 2;
pq.push(pile);
}
int res = 0;
while (!pq.empty()){
res += pq.top();
pq.pop();
}
return res;
}
};