GESP C++四级真题 | 202603礼盒排序(结构体+排序)

四季读书网 1 0
GESP C++四级真题 | 202603礼盒排序(结构体+排序)

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

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

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

现在推出GESP四级-函数》、GESP四级-排序GESP四级-二维数组专栏,并会分享相关实践经验与同学们一起学习、进步🚀

GESP C++四级真题 | 202603礼盒排序(结构体+排序) 第1张
欢迎关号,共同学习与进步
👍 🌏 ♥️ 🔥 🐳
GESP C++四级真题 | 202603礼盒排序(结构体+排序) 第2张

 往期精选 

GESP C++四级真题 | 202512 优先购买(排序、结构体)

GESP C++四级真题 | 202512建造-二维数组(子矩阵)

GESP C++四级真题 | 202509最长连续段(sort、数组连续性)

GESP C++四级真题 | 202509排兵布阵-二维数组(子矩阵)

GESP C++四级真题 | 202503荒地开垦-二维数组(标记数组、计数数组)

GESP C++四级真题 | 202412Recamán(自定义Recamán生成函数)

GESP C++四级真题 | 202406宝箱(sort+桶排)

GESP C++四级真题 | 202412字符排序(自定义非递减判断函数)

GESP C++四级真题 | 202409区间排序-手撕选择、冒泡、插入排序

GESP C++四级真题 | 202506画布裁剪-二维数组(子矩阵)

GESP C++四级真题 | 202503二阶矩阵-二维数组(子矩阵)

GESP C++四级真题 | 202312田忌赛马(双排贪心)

GESP C++四级真题 | 202403相似字符串-分类讨论

GESP C++四级真题 | 202403做题(直观贪心),数据强度还得看洛谷!

GESP C++四级真题 | 202409黑白方块-二维数组(子矩阵)

GESP C++四级真题 | 202406黑白方块-二维数组,一文说透子矩阵

GESP C++四级真题 | 202406黑白方块-二维数组,一文说透子矩阵

GESP C++四级真题 | 202506排序-逆序对

GESP C++四级真题 | 202312小杨的字典-字符串、结构体与分类讨论

GESP C++四级真题 | 202309变长编码-位运算+进制思想

GESP C++四级真题 | 幸运数-数位分离求数位和

GESP C++四级样题 | 填幻方-二维数组填充,含dfs递归实现

GESP C++四级样题 | 绝对素数

GESP四级编程考试在GESP三级编程的基础上,增加了二维数组应用,函数与异常,结构体与指针,文件操作,冒泡、选择、插入排序算法(sort),递推算法(递归函数)。括号内容虽有超纲,但是先学先受益!

GESP C++四级真题 | 202603礼盒排序(结构体+排序) 第3张

四级真题:202603礼盒排序

01

题目描述:
GESP C++四级真题 | 202603礼盒排序(结构体+排序) 第4张
题目来源

洛谷网B4502

解题思路

02

一、题意分析

  • 核心问题:对 n 个礼盒进行多关键字排序,输出排序后的编号。

  • 排序规则(优先级从高到低)

    1. 礼盒总价格从小到大

    2. 礼盒中最贵商品的价格从小到大

    3. 礼盒中最便宜商品的价格从小到大

    4. 礼盒编号从小到大

  • 输入

    • 第一行:n, k

    • 接下来 n 行,每行 k 个整数,表示第 i 个礼盒中商品的价格

  • 输出:排序后的礼盒编号(编号从1开始),空格分隔

  • 数据范围

    • n ≤ 1000k ≤ 10

    • 价格 ≤ 10^4

二、样例分析:

    略(可参考视频讲解)

    三、建模思路

    方法:结构体+sort自定义排序

    1. 数据结构设计:每个礼盒需要存储:

      • id:编号(1-based)

      • tot:总价格(所有商品价格之和)

      • ma:最贵商品的价格

      • mi:最便宜商品的价格

    2. 计算统计量:对每个礼盒,遍历 k 个商品,计算总和、最大值、最小值。

    3. 自定义排序:按题目规则实现比较函数。

    4. 输出:排序后输出编号。

    四、算法选择

    • 算法:结构体数组 + 自定义排序(sort + 比较函数)

    • 时间复杂度:统计 O(n*k),排序 O(n log n),对于 n=1000 完全可行。

    • 空间复杂度O(n)

    题解代码

    03

    题目难度入门级,需要注意的细节很多!

    #include<bits/stdc++.h>using namespace std;struct Box {    int id;        // 礼盒编号    int tot;     // 总价格    int ma;  // 最贵商品价格    int mi;  // 最便宜商品价格};// 自定义比较函数boolcmp(const Box& x, const Box& y){    // 规则1:先按礼盒总价格从小到大排序    if (x.tot != y.tot) return x.tot < y.tot;    // 总价格相同时    // 按规则2:礼盒中最贵商品的价格从小到大排序    if (x.ma != y.ma) return x.ma < y.ma;    // 总价格相同时,最大值也相同时    // 按规则3礼盒中最便宜商品的价格从小到大排序    if (x.mi != y.mi) return x.mi < y.mi;    // 规则4:以上都相同时,按礼盒编号从小到大排序    // 注意:编号是唯一的,不会有相等的情况    return x.id < y.id;}Box a[1005];  // n ≤ 1000intmain(){    int n, k;    cin >> n >> k;        for (int i = 1; i <= n; i++) {        a[i].id = i;  // 编号从1开始        int sum = 0, ma = INT_MIN, mi = INT_MAX;        for (int j = 0; j < k; j++) {            int p;            cin >> p;            sum += p;            if (p > ma) ma = p;            if (p < mi) mi = p;        }        a[i].tot = sum;        a[i].ma = ma;        a[i].mi = mi;    }    // 排序    sort(a+1, a+1+n, cmp);    // 输出编号    for (int i = 1; i <= n; i++) {        cout << a[i].id;        if (i != n) cout << " ";        else cout << endl;    }    return 0;}

    GESP C++四级真题 | 202603礼盒排序(结构体+排序) 第5张

    恭喜您,代码AC通过100分!

    GESP C++四级真题 | 202603礼盒排序(结构体+排序) 第6张
    本题是典型的结构体数组排序问题,核心在于:
    1. 结构体的定义

    2. 自定义比较函数cmp的实现

    3. sort的运用与理解

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