怪物死亡顺序模拟问题解析与解决方案

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

题目描述 小明正在电脑上玩一款打怪游戏,一共有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

回答:

要解决这个问题,我们需要模拟小明的攻击过程,确保每次攻击都针对血量最高的怪物,并在血量相同的情况下优先攻击编号较小的怪物。我们可以使用一个优先队列(最大堆)来实现这一点。

以下是解决问题的步骤:

  1. 输入读取:读取怪物的数量 n 和攻击力 k,以及每只怪物的血量。
  2. 构建最大堆:将每只怪物的血量和其编号存入最大堆中。我们可以使用负值来模拟最大堆,因为 Python 的 heapq 默认是最小堆。
  3. 模拟攻击过程
    • 每次从堆中取出血量最高的怪物。
    • 计算该怪物在攻击后剩余的血量。
    • 如果血量仍然大于零,则将其重新放回堆中;如果血量小于等于零,则记录该怪物的编号为死亡顺序。
  4. 输出结果:按照记录的死亡顺序输出怪物的编号。

下面是实现这个逻辑的 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 来实现最大堆,通过存储负的血量值。
  • 在每次攻击中,我们从堆中取出血量最高的怪物,计算其新的血量,并决定是否将其重新放回堆中。
  • 最终,我们将死亡的怪物编号按顺序存储并输出。

时间复杂度:

  • 每次插入和删除操作的时间复杂度为 O(log n),因此整体的时间复杂度为 O(n log n),适合处理最大 100000 个怪物的情况。