# 贪心算法
# 维护一个最小堆,每次pop()出最小的,然后把它的两倍加入堆中
import sys
import heapq
# 获取数据
n, target = list(map(int, sys.stdin.readline().split(" ")))
consumption = list(map(int, sys.stdin.readline().split(" ")))
def max_days(k, a):
# 初始化最小堆,存储每个口罩当前的不舒适度
heap = a.copy()
heapq.heapify(heap)
total_discomfort = 0
days = 0
while heap:
# 获取当前不舒适度最小的口罩
discomfort = heapq.heappop(heap)
# 检查是否可以使用这个口罩
if total_discomfort + discomfort > k:
break
# 使用这个口罩
total_discomfort += discomfort
days += 1
# 将该口罩的下次使用不舒适度放回堆中
heapq.heappush(heap, discomfort * 2)
return days
print(max_days(target, consumption))
第一反应是一个0-1背包问题的变种,但发现不好算出需要添加的元素,但找元素的过程就是贪心+每个基本元素的最大堆,所以发现想复杂了换了个思路

京公网安备 11010502036488号