问题描述
有 N N N个怪兽, M M M个弓箭,每个怪兽有生命值,每个弓箭有杀伤力和价值,每个怪兽只能用一支弓箭攻击,弓箭杀伤>=怪兽生命时可消灭怪兽,求使用弓箭的最小价值。如无法消灭,返回-1。
问题解析
因为目标是消灭怪兽,而且每个怪兽只能被一只弓箭攻击,所以我们应该在优先考虑消灭的基础上,选择最小价值的弓箭。根据这个推理,我们可以将怪兽的生命值非升序排序,并同时将弓箭按照攻击力进行非升序排序。最后,循环遍历能消灭当前怪兽的弓箭,并使用优先队列进行维护,选择价值最小的那一只即可解决该问题。
代码解析
N, M = map(int, input().split())
if M < N:
return -1
monst_list = list(map(int, input().split())) # N
monst_list.sort(key=lambda x: -x)
value_list = list(map(int, input().split())) # M
attack_list = list(map(int, input().split())) # M
arrow_list = [(value, attack) for value, attack in zip(value_list, attack_list)] # M
arrow_list.sort(key=lambda x: -x[1])
del attack_list
value_list = []
res = 0
j = 0
for i in range(N):
while j < M and arrow_list[j][1] >= monst_list[i]:
hp.heappush(value_list, - arrow_list[j][0])
j += 1
if not value_list:
return -1
else:
res += -value_list.pop()
return res