top1编程
← 返回题目
题解

最厉害的学生

1 条题解

  • 0
    @ 2026-8-5 23:54:04

    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