用c语言写 题目描述 小明正在电脑上玩一款打怪游戏,一共有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
要解决这个问题,我们可以使用一个优先队列(最大堆)来管理怪物的血量和编号。每次我们从堆中取出血量最高的怪物进行攻击,直到所有怪物都死亡。以下是用C语言实现的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int health;
int index;
} Monster;
// 比较函数,用于最大堆
int compare(const void *a, const void *b) {
Monster *monsterA = (Monster *)a;
Monster *monsterB = (Monster *)b;
if (monsterA->health == monsterB->health) {
return monsterA->index - monsterB->index; // 编号小的优先
}
return monsterB->health - monsterA->health; // 血量高的优先
}
int main() {
int n, k;
scanf("%d %d", &n, &k);
Monster monsters[n];
for (int i = 0; i < n; i++) {
scanf("%d", &monsters[i].health);
monsters[i].index = i + 1; // 编号从1开始
}
// 使用qsort进行排序,模拟最大堆的行为
qsort(monsters, n, sizeof(Monster), compare);
int deathOrder[n];
int deathCount = 0;
while (deathCount < n) {
// 取出血量最高的怪物
Monster *current = &monsters[0];
// 计算当前怪物的剩余血量
current->health -= k;
if (current->health <= 0) {
// 记录死亡顺序
deathOrder[deathCount++] = current->index;
// 将当前怪物的血量设为一个负值,表示已死亡
current->health = -1;
// 重新排序
qsort(monsters, n, sizeof(Monster), compare);
}
}
// 输出死亡顺序
for (int i = 0; i < n; i++) {
printf("%d ", deathOrder[i]);
}
printf("\n");
return 0;
}
Monster
结构体来存储怪物的血量和编号。compare
函数用于 qsort
,根据血量和编号对怪物进行排序。n
和攻击力 k
,然后读取每个怪物的血量。qsort
,每次攻击后都需要重新排序,这在性能上可能不是最优的,但对于题目给定的约束条件(n ≤ 100000),这个实现是可行的。qsort
来模拟最大堆的行为,实际应用中可以考虑使用更高效的堆结构来优化性能。