笔试的最后一题:公司有A,B,C三个组,每组10个人,年终考核满分为一百分,要求输出排名前五的分数和组名。输出:A:98 97 B:95 C:93,94,各位有啥思路吗
将三个组当成一个组进行循环判断,另外定义一个大小为5的数组,记录排名情况。
五次循环搜索30人中最高分,记录最高分下标,按顺序记录到排名数组中。每次搜索时,如果遇到已经在排名数组中的序号,则跳过。
最终输出排名数组数据,将存储的下标值除以10,加上'A',就是所在的组名。存储下标值求余10,就是所在组的成绩下标
三组分别建大顶堆 A,B,C,堆顶为分数最高的人。然后将三组堆顶取走,三个人与组名合在一起再建一个大顶堆 D。
从D堆顶取走的就是当前分数最大的人,每取走一个,就从他所在的组的堆顶再挪一个进来,这样取五次,就是结果。
补充:这题有多种做法,而且数据范围小,怎么做都不会超时,但这样的题目放在面试里就要好好想想了。这是典型的N个数里取K个最大(小)数的题,考察的就是堆结构。
首先,肯定要先定义一个struct,来存每个人的信息,成员有组别和分数
然后一个长度5的数组,来存前5名
循环读取,每读到一个去跟数组第1项比对,只要比第1项大就替换掉,然后对数组排序
一直循环到结束,输出数组里的内容
该回答引用GPTᴼᴾᴱᴺᴬᴵ,具体如下:
先使用 srand() 函数初始化随机数生成器。然后使用嵌套的循环随机生成每个人的得分,并且输出每个组的得分情况。接着计算每个组的总分,输出每个组的总分,并按总分排序。最后输出排名前五的组的总分和组名,以及排名第五的组的得分。
以下是一个示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define GROUPS 3
#define MEMBERS_PER_GROUP 10
#define MAX_SCORE 100
int main() {
srand(time(NULL)); // 初始化随机数生成器
int scores[GROUPS][MEMBERS_PER_GROUP]; // 保存每个人的得分
char group_names[GROUPS] = {'A', 'B', 'C'}; // 保存每个组的名字
// 随机生成每个人的得分
for (int i = 0; i < GROUPS; i++) {
printf("Group %c:\n", group_names[i]);
for (int j = 0; j < MEMBERS_PER_GROUP; j++) {
scores[i][j] = rand() % (MAX_SCORE + 1);
printf("%d ", scores[i][j]);
}
printf("\n");
}
// 计算每个组的总分
int total_scores[GROUPS] = {0};
for (int i = 0; i < GROUPS; i++) {
for (int j = 0; j < MEMBERS_PER_GROUP; j++) {
total_scores[i] += scores[i][j];
}
}
// 输出每个组的总分
for (int i = 0; i < GROUPS; i++) {
printf("Group %c: %d\n", group_names[i], total_scores[i]);
}
// 按总分排序
for (int i = 0; i < GROUPS - 1; i++) {
for (int j = i + 1; j < GROUPS; j++) {
if (total_scores[i] < total_scores[j]) {
// 交换组名和总分
int temp_score = total_scores[i];
total_scores[i] = total_scores[j];
total_scores[j] = temp_score;
char temp_name = group_names[i];
group_names[i] = group_names[j];
group_names[j] = temp_name;
}
}
}
// 输出排名前五的组的总分和组名
printf("Top 5:\n");
for (int i = 0; i < 5; i++) {
printf("%c:%d ", group_names[i], total_scores[i]);
}
printf("\n");
// 输出排名第五的组的得分
printf("%c:", group_names[4]);
for (int i = 0; i < MEMBERS_PER_GROUP; i++) {
if (scores[4][i] == total_scores[4]) {
printf("%d ", scores[4][i]);
}
}
printf("\n");
return 0;
}
如果以上回答对您有所帮助,望采纳~谢谢