📅  最后修改于: 2023-12-03 15:12:26.444000             🧑  作者: Mango
给定一个长度为N的数组,每次可以删除K个元素,删除这些元素的代价为数组中剩余元素的总和,直到数组为空。求删除的顺序及删除的代价使得删除数组的总代价最小。
这是一个贪心策略问题,我们需要寻找贪心策略。首先可以排除选择数组中最大的K个数删除,因为删除最大数得到的代价并不一定比删除其他数的代价小。考虑到代价与数组中剩余元素的总和有关,我们可以尝试优先删除数组中较小的数。
因此,我们可以对数组进行排序,每次删除前K个数,直到数组为空。由于删除的顺序不同会产生不同的代价,我们可以使用堆来优化删除顺序。
import heapq
def delete_array(array, k):
cost = 0
heapq.heapify(array) # 转化为小根堆
while array:
sub_array = heapq.nsmallest(k, array) # 找到前k小的数
for num in sub_array:
cost += num
array.remove(num) # 从数组中删除
return cost
排序的时间复杂度为O(NlogN),每次需要找前k小的数,时间复杂度为O(klogN),因此总的时间复杂度为O(NklogN)。
假设数组为[3, 5, 2, 6, 8, 1, 9, 7, 4],k为3,则代价最小的删除顺序为:
代价最小为6+23+24=53。