题目描述 小明正在电脑上玩一款打怪游戏,一共有n只怪物,编号从1到n,第i只怪物的血量为a[i]。小明的角色攻击力为k,对怪物进行攻击时,怪物的血量减少k,当怪物的血量小于等于零时,怪物死亡。但是他每次只能攻击血量最高的怪物,如果几只怪物血量相同,则攻击编号小的那个。你的目标是求出怪物死亡的顺序。 输入 第一行两个整数n和k。(1<=n<=100000,1<=k<=1e9)表示怪物的数量和角色攻击力。
第二行n个正整数a1,a2.....an。表示n个怪物的血量(1<=a[i]<=1e9)。
输出 一行,按怪物死亡顺序排列的编号。 样例输入 复制 3 2 1 2 3 样例输出 复制 2 1 3
要解决这个问题,我们需要模拟小明的攻击过程,确保每次攻击都针对血量最高的怪物,并在血量相同的情况下优先攻击编号较小的怪物。我们可以使用一个优先队列(最大堆)来实现这一点。
以下是解决问题的步骤:
n
和攻击力 k
,以及每只怪物的血量。heapq
默认是最小堆。下面是实现这个逻辑的 Python 代码:
import heapq
def monster_death_order(n, k, health):
# 创建一个最大堆,存储 (-血量, 编号)
max_heap = []
for i in range(n):
heapq.heappush(max_heap, (-health[i], i + 1)) # 使用负值来模拟最大堆
death_order = []
while max_heap:
# 取出血量最高的怪物
current_health, monster_id = heapq.heappop(max_heap)
current_health = -current_health # 还原为正值
# 计算攻击后的血量
current_health -= k
if current_health > 0:
# 如果怪物还活着,重新放回堆中
heapq.heappush(max_heap, (-current_health, monster_id))
else:
# 如果怪物死亡,记录其编号
death_order.append(monster_id)
return death_order
# 读取输入
n, k = map(int, input().split())
health = list(map(int, input().split()))
# 获取死亡顺序
result = monster_death_order(n, k, health)
# 输出结果
print(" ".join(map(str, result)))
heapq
来实现最大堆,通过存储负的血量值。