2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集
题目描述
小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?
输入描述
第1行输入两个整数,学生人数n和科目数量m。0<n<100,0<m<10
第2行输入m个科目名称,彼此之间用空格隔开。科目名称只由英文字母构成,单个长度不超过10个字符。科目的出现顺序和后续输入的学生成绩一一对应。不会出现重复的科目名称。
第3行开始的n行,每行包含一个学生的姓名和该生m个科目的成绩(空格隔开),学生不会重名。学生姓名只由英文字母构成,长度不超过10个字符。成绩是0~100的整数,依次对应第2行中输入的科目。
第n+2行,输入用作排名的科目名称。若科目不存在,则按总分进行排序。
输出描述
输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。
示例1
输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 100 82
shuxue
输出:
xiaohua fangfang minmin
说明:
按shuxue成绩排名,依次是xiaohua、fangfang、minmin
示例2
输入:
3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 90 95
zongfen
输出:
fangfang minmin xiaohua
说明:
排序科目不存在,按总分排序,fangfang和minmin总分相同,按姓名的字典顺序,fangfang排在前面
题解
题目类型
该题目属于排序算法题,考察学生成绩排序,结合字符串和数字的处理。
解题思路
- 输入数据处理:读取学生人数和科目数量,接着读取科目名称,随后读取每个学生的姓名和对应的成绩。
- 总分计算:在读取学生成绩的同时计算每个学生的总分。
- 排序关键字确定:读取要进行排序的科目名称,确定排序是按某个具体科目还是按总分。
- 排序:利用快速排序
qsort
,根据排序的科目或总分进行排序。如果成绩相同,按照学生姓名的字典顺序排序。- 输出结果:按照排序后的顺序输出学生的名字。
C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生人数和科目数量
int n, m;
int sortIndex = -1; // 排序索引,默认-1表示按总分排序
typedef struct {
char name[20]; // 学生姓名
int scores[100]; // 学生成绩数组
int totalScore; // 学生总分
} Student;
// 比较函数,用于qsort排序
int cmp(const void* a, const void* b) {
const Student* stu1 = (const Student*)a;
const Student* stu2 = (const Student*)b;
// 如果按某个科目排序
if (sortIndex != -1) {
if (stu1->scores[sortIndex] != stu2->scores[sortIndex]) {
return stu2->scores[sortIndex] - stu1->scores[sortIndex];
}
} else { // 否则按总分排序
if (stu1->totalScore != stu2->totalScore) {
return stu2->totalScore - stu1->totalScore;
}
}
// 如果成绩相同,按姓名字典顺序排序
return strcmp(stu1->name, stu2->name);
}
int main() {
// 输入学生人数和科目数量
scanf("%d %d", &n, &m);
char courses[20][20];
// 输入科目名称
for (int i = 0; i < m; i++) scanf("%s", courses[i]);
Student students[100];
// 输入每个学生的姓名和成绩,并计算总分
for (int i = 0; i < n; i++) {
scanf("%s", students[i].name);
int totalScore = 0;
for (int j = 0; j < m; j++) {
scanf("%d", &students[i].scores[j]);
totalScore += students[i].scores[j];
}
students[i].totalScore = totalScore;
}
// 输入排序的科目名称
char course[20];
scanf("%s", course);
// 确定排序索引
for (int i = 0; i < m; i++) {
if (strcmp(courses[i], course) == 0) {
sortIndex = i;
break;
}
}
// 对学生数组进行排序
qsort(students, n, sizeof(Student), cmp);
// 输出排序后的学生姓名
for (int i = 0; i < n; i++) {
if (i + 1 == n) {
printf("%s\n", students[i].name);
} else {
printf("%s ", students[i].name);
}
}
return 0;
}
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏