输入共 � + � + 1 n+m+1 行。 输入的第一行为两个整数 � , � n,m,分别代表求生者阵营角色数和监管者阵营角色数。 接下来 � + � n+m 行,首先为一个仅由英文字母组成的字符串,代表该角色的姓名;接下来为一个大写字符 H 或 S,若为 H,则代表该角色为监管者阵营,若为 S,则代表该角色为求生者阵营;接下来一个正整数,代表该阵营选手对该角色的熟练度。上述字符串、大写字符、正整数之间由一个空格分隔。用C语言写出
时间: 2024-02-26 15:55:49 浏览: 117
以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义角色结构体
typedef struct {
char name[20]; // 姓名
char camp; // 阵营
int proficiency; // 熟练度
int ban; // 是否被 ban
} Role;
// 比较函数,按照熟练度从高到低排序
int cmp(const void* a, const void* b) {
Role* r1 = (Role*)a;
Role* r2 = (Role*)b;
return r2->proficiency - r1->proficiency;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
// 读入角色信息
Role* survivors = (Role*)malloc(n * sizeof(Role));
Role* hunters = (Role*)malloc(m * sizeof(Role));
for (int i = 0; i < n; i++) {
scanf("%s %c %d", survivors[i].name, &survivors[i].camp, &survivors[i].proficiency);
survivors[i].ban = 0;
}
for (int i = 0; i < m; i++) {
scanf("%s %c %d", hunters[i].name, &hunters[i].camp, &hunters[i].proficiency);
hunters[i].ban = 0;
}
// 对角色按照熟练度从高到低排序
qsort(survivors, n, sizeof(Role), cmp);
qsort(hunters, m, sizeof(Role), cmp);
// 监管者 ban 掉求生者阵营熟练度最高的 5 个角色,求生者 ban 掉监管者阵营熟练度最高的 2 个角色
for (int i = 0; i < 5; i++) {
survivors[i].ban = 1;
}
for (int i = 0; i < 2; i++) {
hunters[i].ban = 1;
}
// 求生者从未被 ban 的角色中选择 4 个不同的角色
char survivor_picks[4][20];
int pick_count = 0;
for (int i = 0; i < n && pick_count < 4; i++) {
if (!survivors[i].ban) {
strcpy(survivor_picks[pick_count], survivors[i].name);
pick_count++;
}
}
// 监管者从未被 ban 的角色中选择 1 个角色
char hunter_pick[20];
for (int i = 0; i < m; i++) {
if (!hunters[i].ban) {
strcpy(hunter_pick, hunters[i].name);
break;
}
}
// 输出结果
printf("Survivors' picks: %s, %s, %s, %s\n", survivor_picks[0], survivor_picks[1], survivor_picks[2], survivor_picks[3]);
printf("Hunter's pick: %s\n", hunter_pick);
// 释放内存
free(survivors);
free(hunters);
return 0;
}
```
需要注意的是,在使用字符串时,我们需要使用字符数组而不是指针,因为字符数组可以直接进行数组操作。此外,在使用字符串时,要注意空间分配和拷贝,避免出现内存泄漏或数据损坏的情况。
阅读全文