1102 字
6 分钟
GESP 2026年C++四级编程题解析

202603-1 山之谷#

题目描述

现有一片山地,可以视为一个 NNMM 列的网格图,第 iijj 列的海拔为 hi,jh_{i,j}

如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 88 个方向)的海拔,则称该单元格为山谷。

请你数一数该片山地中有多少山谷。

输入格式

第一行包含 22 个整数 N,MN, M,表示山地的大小。

之后 NN 行,每行包含 MM 个整数 hi,1,hi,2,,hi,Mh_{i,1}, h_{i,2}, \cdots, h_{i,M},表示海拔。

输出格式

输出 11 行,包含 11 个整数 CC,表示山谷的数量。

样例输入 1

3 5
7 6 6 7 9
6 5 6 7 6
6 5 7 8 9

样例输出 1

3

提示

【样例解释】

样例 1 如图所示,绿色单元格代表山谷:

【数据范围】

保证 1N,M1001 \leq N, M \leq 1001hi,j1051 \leq h_{i,j} \leq 10^5

代码解析

这是一道经典的矩阵内枚举题目,我们可以枚举每个单元格,如果单元格周围的八个格子都大于单元格,则为山谷,答案加一。

为了避免枚举时越界,我们从 (1,1)(1,1) 开始枚举,到 (n,m)(n,m) 结束(越界则为 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 礼盒排序#

题目描述

商店推出了许多礼盒,每个礼盒中包含 kk 件商品,每件商品都有一个价格。

现在需要对这些礼盒进行排序,排序规则如下:

  1. 先按礼盒总价格从小到大排序;
  2. 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;
  3. 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;
  4. 如果仍然相同,按礼盒编号从小到大排序。

请输出排序后的礼盒编号。 输入格式

第一行包含两个整数 nnkk,分别表示礼盒数量和每个礼盒中商品的数量。

接下来 nn 行,每行包含 kk 个整数,第 ii 行表示第 ii 个礼盒中各商品的价格。

输出格式

输出一行,包含排序后的礼盒编号(编号从 11 开始),用空格分隔。

样例输入 1

4 3
3 5 2
4 1 5
2 2 4
3 4 3

样例输出 1

3 4 2 1

提示

【样例解释】

编号商品价格总价最大值最小值
113 5 23\ 5\ 21010 5522
224 1 54\ 1\ 510105511
332 2 42\ 2\ 4884422
443 4 33\ 4\ 310104433

排序过程:

  1. 按总价排序,33 号礼盒总价最小;
  2. 其余总价均为 1010,再按最大值排序,44 号最大值更小;
  3. 11 号和 22 号最大值相同,再按最小值排序,22 号更小。

最终顺序为:3 4 2 13 \ 4 \ 2 \ 1

【数据范围】

保证 1n1031 \leq n \leq 10^31k101 \leq k \leq 1011 \leq 商品价格 104\leq 10^4

代码解析

也是一道经典的四级常考结构体排序题目,但是注意不要陷入题目误区而去存储礼盒中所有商品的价格,对于每一个礼盒,我们只需要记录礼盒编号、礼盒总价格、礼盒中最贵商品价格、礼盒中最便宜商品价格即可。

#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/
作者
Yezi 叶子
发布于
2026/03/14
许可协议
CC BY-NC-SA 4.0