👆点击知行合一Gesp>点击右上角“···”>设为星标🌟
大家好,我是黄老师。 曾任职多家国有大型科技公司,具有多年C/C++实战经验,打造过数百万用户规模的电子终端产品。目前是一名少儿C++编程业余讲师,毕竟CSP也自称非专业。😁
已经完成《GESP一级保命系列》专栏,《GESP二级编程保命-字符图形》专栏以及《GESP二级编程保命-暴力枚举》专栏、GESP三级编程-一维数组、GESP三级编程-字符串、GESP三级编程-进制转换、GESP三级编程-位运算、GESP三级编程-排序等等三级专题,供大家参考。
现在推出《GESP四级-函数》、《GESP四级-排序》、《GESP四级-二维数组》专栏,并会分享相关实践经验,与同学们一起学习、进步。🚀
往期精选
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++四级真题 | 202312小杨的字典-字符串、结构体与分类讨论
GESP C++四级真题 | 202309变长编码-位运算+进制思想
GESP四级编程考试在GESP三级编程的基础上,增加了二维数组应用,函数与异常,结构体与指针,文件操作,冒泡、选择、插入排序算法(sort),递推算法(递归函数)。括号内容虽有超纲,但是先学先受益!

四级真题:202603礼盒排序
01

洛谷网B4502
解题思路
02
一、题意分析
核心问题:对
n个礼盒进行多关键字排序,输出排序后的编号。排序规则(优先级从高到低):
礼盒总价格从小到大
礼盒中最贵商品的价格从小到大
礼盒中最便宜商品的价格从小到大
礼盒编号从小到大
输入:
第一行:
n, k接下来
n行,每行k个整数,表示第i个礼盒中商品的价格输出:排序后的礼盒编号(编号从1开始),空格分隔
数据范围:
n ≤ 1000,k ≤ 10价格 ≤ 10^4
二、样例分析:
略(可参考视频讲解)
三、建模思路
方法:结构体+sort自定义排序
数据结构设计:每个礼盒需要存储:
id:编号(1-based)tot:总价格(所有商品价格之和)ma:最贵商品的价格mi:最便宜商品的价格计算统计量:对每个礼盒,遍历
k个商品,计算总和、最大值、最小值。自定义排序:按题目规则实现比较函数。
输出:排序后输出编号。
四、算法选择
算法:结构体数组 + 自定义排序(
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;}

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

结构体的定义
自定义比较函数cmp的实现
sort的运用与理解