题目描述
N个人被困在了M (1≤M≤1000)个山洞里,他们每个人都发送了一条信息告知了被困的山洞编号,救援人员的救援规则是:被困人数最多的山洞应当先被救援,若两个山洞被困人数相同,则优先救援编号较小的山洞。
输入描述
第一行为一个整数N(3≤N≤100000),表示被困人数。第二行为N个数,表示N个人被困的山洞编号。
输出描述
输出救援人员的救援顺序。
案例代码
实现这个救援规则的一种方法是使用哈希表来统计每个山洞的被困人数,然后按照规则进行排序并输出。
以下是一个用C语言实现的示例代码:
#include <stdio.h>
#include <stdlib.h>
// 定义哈希表结点
typedef struct Node {
int cave; // 山洞编号
int count; // 被困人数
} Node;
// 比较函数,用于qsort排序
int compare(const void* a, const void* b) {
Node* nodeA = (Node*)a;
Node* nodeB = (Node*)b;
// 先比较被困人数,若相同则比较山洞编号
if (nodeA->count != nodeB->count) {
return nodeB->count - nodeA->count;
} else {
return nodeA->cave - nodeB->cave;
}
}
int main() {
int N;
scanf("%d", &N);
// 创建哈希表
Node* hashTable = (Node*)malloc(N * sizeof(Node));
// 初始化哈希表
for (int i = 0; i < N; i++) {
hashTable[i].cave = i + 1;
hashTable[i].count = 0;
}
// 统计每个山洞的被困人数
for (int i = 0; i < N; i++) {
int cave;
scanf("%d", &cave);
hashTable[cave - 1].count++;
}
// 按规则排序
qsort(hashTable, N, sizeof(Node), compare);
// 输出救援顺序
for (int i = 0; i < N; i++) {
printf("%d ", hashTable[i].cave);
}
// 释放内存
free(hashTable);
return 0;
}
该程序首先创建一个大小为N的哈希表,用于统计每个山洞的被困人数。然后通过循环读取每个人被困的山洞编号,并在哈希表中对应山洞的计数器加一。接着使用qsort函数对哈希表按照规则进行排序,最后输出救援顺序。
注意,该程序没有对输入进行错误处理,实际应用中需要根据需要添加相应的输入验证和异常处理逻辑。
© 版权声明
本站资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!
THE END