给出一列数,一共可以实施k个操作,每次可以将其中一个数减去floor(piles[i] / 2),问k次操作之后剩下的数字和最小是多少
思路:用优先队列保存经过x次操作之后的数字,用python的heapq写起来就很方便,每次操作直接用heapreplace把heap顶的数减半替代原值即可(比先pop,改值之后再push要快,beat 100%)
因为heapq是最小堆,所以建堆时先将所有数取负
1 #2279
2 #Runtime: 3519 ms (Beats 100%)
3 #Memory: 26 MB (Beats 37.21%)
4
5 class Solution(object):
6 def minStoneSum(self, piles, k):
7 """
8 :type piles: List[int]
9 :type k: int
10 :rtype: int
11 """
12 hq = [-x for x in piles]
13 heapify(hq)
14 for _ in range(k):
15 heapreplace(hq, hq[0] // 2)
16 return -sum(hq)