题解
最厉害的学生
1 条题解
-
0
P4621 最厉害的学生(入门)
解题思路
这道题要找出三科总分最高的同学,总分相同就取最先出现的。可以想象成一场"谁是全班第一"的擂台赛,分四步。
第一步,设计擂台赛规则。 同学们一个一个上台报名字和三科分数,老师在台下算总分,并记下目前的"最高分选手"。每来一位新同学,就比一比:总分更高就让他当新的擂主;只是并列就保持原来的同学不变。等所有人都报完,最后站着的既是总分最高、又是最早出现的那位。
第二步,用一个例子验证。 第一位同学总分 169,先当擂主;第二位总分 177,比 169 高,换人;第三位又得 177,和当前一样,不换。最后输出的就是第二位。注意判断要用"严格大于"(大于号),不能用"大于等于",否则后来的同分者会把先来的挤掉,就不满足"输出靠前的那位"了。
第三步,用结构体装好信息。 姓名用字符数组保存,结构体里存姓名和总分,比较时直接看总分,代码更清晰。每个成绩不超过 150,三科总分最大 450,用 int 完全够用。
第四步,设置好初始值并处理输入。 成绩最小是 0,所以一开始把最高总分设成 -1,这样第一位同学无论考多少分都会更新记录,不会漏选。读入时一行是一个字符串加三个整数,cin 会自动跳过空格和换行,按顺序读取即可。最后输出姓名和总分。
**回顾总结。**擂台赛的思路就是"边读边比,胜者守擂":读入一名学生就算总分,严格更高才换擂主。初始值放 -1 保证第一人必然上场,最后的擂主就是答案。这道题与"倒数第一名"正好是一对镜像题目,一个找最高一个找最低。
参考代码
// 用途:找出三科总分最高且最先出现的学生(最厉害的学生)。 #include <iostream> using namespace std; struct Student { char name[101]; // 学生的姓名 int totalScore; // 学生的三科总分 }; int main() { int n; // 学生人数 cin >> n; // 读入学生人数 Student topStudent; // 保存目前总分最高的学生 topStudent.totalScore = -1; // 总分最小为0,先放一个更小的数 for (int i = 0; i < n; i++) { // 依次处理每名学生 Student current; // 当前学生的信息 int chinese, math, english; // 当前学生的语文、数学、英语成绩 cin >> current.name >> chinese >> math >> english; // 读入学生信息 current.totalScore = chinese + math + english; // 计算三科总分 if (current.totalScore > topStudent.totalScore) { // 只有严格更高才更新 topStudent = current; // 保存当前学生 } } cout << topStudent.name << ' ' << topStudent.totalScore << endl; // 输出姓名和总分 return 0; // 程序结束 }复杂度分析
一次遍历即可完成,时间复杂度 O(n),n 小于 100,速度极快。额外只用了一个结构体变量保存当前最优,空间 O(1)。
- 1