top1编程
← 返回题目
题解

总分排序

1 条题解

  • 0
    @ 2026-8-5 22:12:18

    P4625 总分排序(入门)

    解题思路

    n 名学生每人有学号、语文、数学成绩,要把他们按总分(语文+数学)从高到低排序。这道题比“奖学金”简单,因为题目保证每个学生的总分都不相同,所以只要按总分降序排序即可,不用处理并列的情况。读入时算好总分存入结构体,然后 sort() 按总分从大到小排序,最后依次输出学号和总分,中间用空格隔开。

    举一个具体的例子:学生 2 语文 90、数学 98,总分 188 最高,排在第一位;学生 1 总分 178 排第二;后面依次是学生 4 的 156、学生 5 的 150、学生 3 的 140。因为总分互不相同,所以排序结果是唯一的,不会出现谁先谁后的争论,比较函数里只需要比一个总分就行。

    读入时每一行是学号、语文、数学三个整数,先读学号,再读两科成绩,马上算出总分,不用把语文数学单独保存,能省就省。自定义比较函数返回 a.sum > b.sum,表示总分大的排前面。学号是输入里的第一个数,读入顺序不能搞错,排序后学号会跟着总分一起移动,所以不会弄混。

    参考代码

    // 用途:按语文和数学总分从高到低排序,输出学生的学号和总分。
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    struct Student {
        int id;             // 学生的学号
        int sum;            // 学生的语文数学总分
    };
    
    // 排序规则:总分高的排前面
    bool cmp(const Student& a, const Student& b) {
        return a.sum > b.sum;
    }
    
    int main() {
        int n;                              // 学生人数
        cin >> n;                           // 读入学生人数
        Student a[105];                     // 保存学生信息
    
        for (int i = 0; i < n; i++) {       // 依次读入每名学生
            int chinese, math;              // 当前学生的语文、数学成绩
            cin >> a[i].id >> chinese >> math; // 读入学号和两科成绩
            a[i].sum = chinese + math;      // 计算总分
        }
        sort(a, a + n, cmp);                // 按总分从高到低排序
    
        for (int i = 0; i < n; i++) {       // 输出排序结果
            cout << a[i].id << ' ' << a[i].sum << '\n'; // 输出学号和总分
        }
        return 0;                           // 程序结束
    }
    

    复杂度分析

    sort() 时间 O(n log n),n 最大 100,运行极快。程序用结构体数组保存学生,空间 O(n)。数组下标从 0 开始,读入 n 个人后 sort(a, a+n) 正好覆盖全部元素。比较函数只用总分一个条件,因为题目保证总分互不相同,这样写既简单又不会出错,这也是与“奖学金”一题最大的区别。n 最大 100,数组开 105 足够,多出的几个元素是保险余量,防止边界写错时越界。

    • 1