每日一题之成绩排序(进阶版)
某校进行了一场月考,考试试卷上只有三种题型:选择题、填空题、应用题,每种题型的满分都是一百分。
考试结束后,老师想知道各题型最高分的学生学号,以及总分前三名同学的成绩和学生学号。
若总分相同则按照应用题、填空题、选择题优先级递减的方式排序,如果仍相同,按学号从小到大排序。
输入: 第一行,一个整数n,表示参加考试的学生的数量。3<=N<=500。
接下来n行,每行第一个为学生学号(8位数字),后面跟着三个用空格隔开的整数,分别表示该学生三种题型的得分情况,每个整数都是0到100之间。
输出: 分三行分别输出选择题、填空题、应用题得分最高的学生学号,又分三行输出总分前三名同学的成绩和学生学号
输入样例:
5
1 88 76 80
2 72 85 91
3 77 88 83
4 84 83 89
5 78 90 84
输出样例:
选择题最高分的学生学号: 1
填空题最高分的学生学号: 5
应用题最高分的学生学号: 2
总分前三名学生的学号和成绩:
学号: 4, 总分: 256
学号: 5, 总分: 252
学号: 2, 总分: 248
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Student {
int id; // 学号
int choiceScore; // 选择题得分
int fillScore; // 填空题得分
int appScore; // 应用题得分
int totalScore; // 总分
};
// 自定义比较函数用于排序
bool compareStudents(const Student &a, const Student &b) {
if (a.totalScore != b.totalScore)
return a.totalScore > b.totalScore;
else if (a.appScore != b.appScore)
return a.appScore > b.appScore;
else if (a.fillScore != b.fillScore)
return a.fillScore > b.fillScore;
else if (a.choiceScore != b.choiceScore)
return a.choiceScore > b.choiceScore;
else
return a.id < b.id;
}
int main() {
int N;
cout << "请输入学生人数: ";
cin >> N;
vector<Student> students(N);
int maxChoiceScore = -1, maxFillScore = -1, maxAppScore = -1;
int maxChoiceId = -1, maxFillId = -1, maxAppId = -1;
for (int i = 0; i < N; ++i) {
cout << "请输入第" << i + 1 << "个学生的学号、选择题得分、填空题得分和应用题得分: ";
cin >> students[i].id >> students[i].choiceScore >> students[i].fillScore >> students[i].appScore;
students[i].totalScore = students[i].choiceScore + students[i].fillScore + students[i].appScore;
// 更新每种题型的最高分和对应学号
if (students[i].choiceScore > maxChoiceScore) {
maxChoiceScore = students[i].choiceScore;
maxChoiceId = students[i].id;
}
if (students[i].fillScore > maxFillScore) {
maxFillScore = students[i].fillScore;
maxFillId = students[i].id;
}
if (students[i].appScore > maxAppScore) {
maxAppScore = students[i].appScore;
maxAppId = students[i].id;
}
}
// 按总分排序
sort(students.begin(), students.end(), compareStudents);
// 输出每种题型的最高分学生学号
cout << "选择题最高分的学生学号: " << maxChoiceId << std::endl;
cout << "填空题最高分的学生学号: " << maxFillId << std::endl;
cout << "应用题最高分的学生学号: " << maxAppId << std::endl;
// 输出总分前三名学生学号和成绩
cout << "总分前三名学生的学号和成绩:" << std::endl;
for (int i = 0; i < std::min(3, N); ++i) {
std::cout << "学号: " << students[i].id << ", 总分: " << students[i].totalScore << std::endl;
}
return 0;
}
成绩排序的规则可以多种多样,最后就是返回一个布尔值