GESP C++五级真题 | 202403成绩排序

四季读书网 2 0
GESP C++五级真题 | 202403成绩排序

点击知行合一Gesp>点击右上角“···”>设为星标🌟

大家好,我是黄老师。 曾任职多家国有大型科技公司,具有多年C/C++实战经验,打造过数百万用户规模的电子终端产品。目前是一名少儿C++编业余讲师,毕竟CSP也自非专😁

已经完成GESP一级保命系列》专栏,GESP二级编程保命-字符图形专栏以及GESP二级编程保命-暴力枚举专栏、GESP三级编程-一维数组GESP三级编程-字符串GESP三级编程-进制转换GESP三级编程-位运算GESP三级编程-排序等等三级专题,供大家参考。

现在推出GESP五级数论专栏,并会分享相关实践经验与同学们一起学习、进步🚀

GESP C++五级真题 | 202403成绩排序-第1张图片-四季读书网
GESP C++五级真题 | 202403成绩排序-第2张图片-四季读书网

 往期精选 

GESP四级-二维数组

GESP四级-排序

GESP四级-二维数组

GESP四级-函数

GESP四级-递推递归


GESP认证考级 | 编程题目提交状态AC、WA、TLE……全黑话漂白!

GESP三级C++编程题目汇总贴:2025.11.07

GESP认证考级C++二级保命笔记-嵌套枚举

GESP认证考级C++二级保命笔记-字符图形

GESP认证考级C++一级保命题系列笔记

欢迎关号,共同学习与进步
👍 🌏 ♥️ 🔥 🐳

GESP五级的核心就是“数据结构(链表)+ 基础算法(二分、贪心、分治、递归)+ 数论应用”。备考时,精力可以按 7:3 分配在“算法与数论”和“链表”上。考纲只要求链表,熟练掌握链表的选择、判断题目,满分是首要目标;初等数论与筛法:欧几里得算法、素数筛法、唯一分解定理等,务必掌握代码模版,灵活运用;四大核心算法包括贪心算法、二分算法、分治算法、递归算法

五级

1

202403 成绩排序

GESP C++五级真题 | 202403成绩排序-第3张图片-四季读书网
题目来源

洛谷网B3968

GESP C++五级真题 | 202403成绩排序-第4张图片-四季读书网

↑微信扫码注册信奥公开课小程序↑

五级

2

题解思路

1. 题目分析

核心任务

  • 有 N 名同学,每名有三科成绩(语文 c、数学 m、英语 e)

  • 需要按以下规则从高到低排序:

    1. 比较总分(c + m + e),高者靠前

    2. 总分相同,比较语文+数学总分(c + m),高者靠前

    3. 仍相同,比较语文和数学的最高分 max(c, m),高者靠前

    4. 仍相同,则并列

输出要求

  • 原始输入顺序(1~N)输出每位同学的排名

  • 并列规则:x 人并列第 k 名,则下一名为 k+x 名(跳过 x-1 个名次)

样例验证

2. 建模思路

数据结构

struct stu {    int c, m, e; // 三科成绩    int tot;     // 三科总分    int cm_sum;  // 语文+数学    int cm_max;  // 语文和数学的最高分    int id;      // 原始编号(从1开始)    int rank;    // 最终排名};

    核心思想

    1. 用结构体数组 a[10005] 存储所有同学信息(从1开始使用)

    2. 自定义 cmp 函数实现三关键字降序排序

    3. 排序后,从前到后扫描计算排名

    4. 用 ans[] 数组按原始 id 存储排名,最后输出

    3. 算法选择

    算法:自定义排序 + 遍历计算排名

    时间复杂度:O(N log N)

    空间复杂度:O(N)

    这道题目属于四级考察范畴,评级为弱五级吧

    五级

    3

    题解代码

    标准解法:结构体排序+自定义排序规则

    #include<bits/stdc++.h>using namespace std;struct stu {    int c, m, e; // c:语文, m:数学, e:英语    int tot;     // 三科总分    int cm_sum;  // 语数总分    int cm_max;  // 语数最高分    int id;      // 原始编号(从1开始)    int rank;    // 排名};stu a[10005];    // 全局数组,从1开始使用int ans[10005];  // 存储最终答案// 自定义比较函数boolcmp(const stu& x, const stu& y){    // 规则1:比较总分,高者靠前    if (x.tot != y.tot) return x.tot > y.tot;    // 规则2:总分相同,比较语数总分,高者靠前    if (x.cm_sum != y.cm_sum) return x.cm_sum > y.cm_sum;    // 规则3:语数总分相同,比较语数最高分,高者靠前    if (x.cm_max != y.cm_max) return x.cm_max > y.cm_max;    // 托底规则:返回false表示x,y不用交换(本题全部相同,并列)    return false;}intmain(){    ios::sync_with_stdio(false);    cin.tie(0);    int N;    cin >> N;    // 读入数据(从1开始)    for (int i = 1; i <= N; i++) {        cin >> a[i].c >> a[i].m >> a[i].e;        a[i].tot = a[i].c + a[i].m + a[i].e; // 计算总分        a[i].cm_sum = a[i].c + a[i].m; // 计算语数总分        a[i].cm_max = max(a[i].c, a[i].m); // 计算语数最高分        a[i].id = i; // 记录原始编号    }    // 排序:从位置1开始,共N个元素    sort(a + 1, a + N + 1, cmp);    // 计算排名    a[1].rank = 1;  // 第一名排名为1    for (int i = 2; i <= N; i++) {        // 如果当前同学与前一同学的所有比较条件都相同        if (a[i].tot == a[i-1].tot &&            a[i].cm_sum == a[i-1].cm_sum &&            a[i].cm_max == a[i-1].cm_max) {            // 并列,排名相同            a[i].rank = a[i-1].rank;        } else {            // 不并列,新排名 = 当前位置            a[i].rank = i;        }    }    // 按原始顺序输出    for (int i = 1; i <= N; i++) {        // 将排名存入对应原始id的位置        ans[a[i].id] = a[i].rank;    }    // 按原始id顺序(1~N)输出排名    for (int i = 1; i <= N; i++) {        cout << ans[i] << '\n';    }    return 0;}
    GESP C++四级真题 | 202603礼盒排序(结构体+排序)GESP C++四级真题 | 202512 优先购买(排序、结构体)
    GESP C++五级真题 | 202403成绩排序-第5张图片-四季读书网

    ↑微信扫码注册信奥公开课小程序↑

    GESP C++五级真题 | 202403成绩排序-第6张图片-四季读书网

    加 VX 联系年卡办理与备考资料领取

    五级

    4

    STL题解参考

    使用优先队列 priority_queue 自动排序,需要 < 运算符重载。

    #include<bits/stdc++.h>using namespace std;struct stu {    int c, m, e;    int tot, cm_sum, cm_max;    int id, rank;    // 优先队列的排序(注意:与sort相反)    bool operator<(const stu& other) const {        if (tot != other.tot) return tot < other.tot;        if (cm_sum != other.cm_sum) return cm_sum < other.cm_sum;        return cm_max < other.cm_max;    }};priority_queue<stu> pq;stu a[10005];int ans[10005];intmain(){    ios::sync_with_stdio(false);    cin.tie(0);    int N; cin >> N;    for (int i = 1; i <= N; i++) {        cin >> a[i].c >> a[i].m >> a[i].e;        a[i].tot = a[i].c + a[i].m + a[i].e;        a[i].cm_sum = a[i].c + a[i].m;        a[i].cm_max = max(a[i].c, a[i].m);        a[i].id = i;        pq.push(a[i]);    }    int rank = 1;    while (!pq.empty()) {        stu cur = pq.top();        pq.pop();        // 找并列        vector<int> same;        same.push_back(cur.id);        while (!pq.empty()) {            stu nxt = pq.top();            if (nxt.tot == cur.tot &&                 nxt.cm_sum == cur.cm_sum &&                 nxt.cm_max == cur.cm_max) {                pq.pop();                same.push_back(nxt.id);            } else {                break;            }        }        for (int id : same) {            ans[id] = rank;        }        rank += same.size();    }    for (int i = 1; i <= N; i++) {        cout << ans[i] << '\n';    }    return 0;}
    GESP C++五级真题 | 202403成绩排序-第7张图片-四季读书网

    加 VX 联系年卡办理与备考资料领取

    抱歉,评论功能暂时关闭!