top1编程
← 返回题目
题解

分数最高的同学

1 条题解

  • 0
    @ 2026-8-5 1:22:40

    解题思路

    有 n 位同学的姓名和 CSPJ 复赛得分,要输出得分最高的同学的姓名。如果好几个同学并列最高分,要输出最先输入的那一个。

    做法:

    1. 用数组 name 存每位同学的姓名,数组 score 存每位同学的分数;
    2. 设 best 记录“目前最高分同学的下标”,一开始先假设第 1 个同学(best = 0);
    3. 从第 2 个同学开始往后看:只有当 score[i] 严格大于 score[best] 时才更新 best。用“严格大于”是为了保证并列最高分时,保留最先输入的那位同学;
    4. 最后输出 name[best]。

    参考代码

    // P4435 分数最高的同学:找出成绩最高的人,输出其姓名(同分取最先输入的那个)
    #include <iostream>
    using namespace std;
    
    char name[500][205]; // 保存每位同学的姓名,长度不超过 200
    int score[500];      // 保存每位同学的分数
    
    int main() {
        int n; // 学生人数
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> name[i] >> score[i]; // 读姓名和成绩
        }
    
        int best = 0; // 记录最高分同学的下标,先假设第 1 个
        for (int i = 1; i < n; i++) {
            // 只有"严格大于"才更新,保证同分时保留最先输入的那个
            if (score[i] > score[best]) best = i;
        }
    
        cout << name[best] << endl; // 输出分数最高的同学姓名
        return 0;
    }
    

    复杂度分析

    • 每个同学都要比较一次分数,学生人数最多 500,时间复杂度是 O(n)。
    • 需要存下所有同学的姓名和分数,空间复杂度是 O(n)(姓名长度最长 200)。
    • 1