1102 字
6 分钟
GESP 2026年C++四级编程题解析
202603-1 山之谷
题目描述
现有一片山地,可以视为一个 行 列的网格图,第 行 列的海拔为 。
如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 个方向)的海拔,则称该单元格为山谷。
请你数一数该片山地中有多少山谷。
输入格式
第一行包含 个整数 ,表示山地的大小。
之后 行,每行包含 个整数 ,表示海拔。
输出格式
输出 行,包含 个整数 ,表示山谷的数量。
样例输入 1
3 57 6 6 7 96 5 6 7 66 5 7 8 9样例输出 1
3提示
【样例解释】
样例 1 如图所示,绿色单元格代表山谷:

【数据范围】
保证 ,。
代码解析
这是一道经典的矩阵内枚举题目,我们可以枚举每个单元格,如果单元格周围的八个格子都大于单元格,则为山谷,答案加一。
为了避免枚举时越界,我们从 开始枚举,到 结束(越界则为 0),同时我们使用偏移数组 dx, dy 数组来表示八个方向,简化代码。
#include<bits/stdc++.h>using namespace std;int n, m, cnt, a[105][105];
bool check(int i, int j) { int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1}; int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1}; for (int x = 0; x < 8; x++) for (int y = 0; y < 8; y++) if (a[i+dx[x]][j+dy[y]] < a[i][j] && a[i+dx[x]][j+dy[y]] != 0) return false; return true;}
int main() {
cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> a[i][j]; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (check(i, j)) cnt++; cout << cnt;
return 0;}202603-2 礼盒排序
题目描述
商店推出了许多礼盒,每个礼盒中包含 件商品,每件商品都有一个价格。
现在需要对这些礼盒进行排序,排序规则如下:
- 先按礼盒总价格从小到大排序;
- 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;
- 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;
- 如果仍然相同,按礼盒编号从小到大排序。
请输出排序后的礼盒编号。 输入格式
第一行包含两个整数 和 ,分别表示礼盒数量和每个礼盒中商品的数量。
接下来 行,每行包含 个整数,第 行表示第 个礼盒中各商品的价格。
输出格式
输出一行,包含排序后的礼盒编号(编号从 开始),用空格分隔。
样例输入 1
4 33 5 24 1 52 2 43 4 3样例输出 1
3 4 2 1提示
【样例解释】
| 编号 | 商品价格 | 总价 | 最大值 | 最小值 |
|---|---|---|---|---|
排序过程:
- 按总价排序, 号礼盒总价最小;
- 其余总价均为 ,再按最大值排序, 号最大值更小;
- 号和 号最大值相同,再按最小值排序, 号更小。
最终顺序为:
【数据范围】
保证 ,, 商品价格 。
代码解析
也是一道经典的四级常考结构体排序题目,但是注意不要陷入题目误区而去存储礼盒中所有商品的价格,对于每一个礼盒,我们只需要记录礼盒编号、礼盒总价格、礼盒中最贵商品价格、礼盒中最便宜商品价格即可。
#include<bits/stdc++.h>using namespace std;struct box { int idx, total = 0; int mi = 10005, ma = 0;};bool cmp(box a, box b) { if (a.total != b.total) return a.total < b.total; else if (a.ma != b. ma) return a.ma < b.ma; else if (a.mi != b.mi) return a.mi < b.mi; else return a.idx < b.idx;}int main() {
int n, k, p; box a[1005]; cin >> n >> k; for (int i = 0; i < n; i++) { for (int j = 0; j < k; j++) { cin >> p; // 输入商品价格时,更新礼盒总价格、最大值、最小值 a[i].idx = i+1; a[i].total += p; a[i].mi = min(a[i].mi, p); a[i].ma = max(a[i].ma, p); } } sort(a, a+n, cmp); for (int i = 0; i < n; i++) cout << a[i].idx << ' ';
return 0;} GESP 2026年C++四级编程题解析
https://yezi.press/posts/gesp/gesp-cpp4-2026/
陕公网安备61010302001363号