2025年12月GESP认证C++编程七级真题试卷

一、单选题(每题 2 分,共 30 分)
第 1 题 下面关于C++中形参、实参和定义域的说法中,正确的一项是( )。
第 2 题 已知三个序列: s1 = {3, 1, 8, 2, 5, 6, 7, 4} , s2 = {1, 5, 1, 8, 6, 4, 7, 5, 6} , s3 = {1, 8, 3, 5, 7, 6, 2, 4} 。以下哪个序列是它们的最长公共子序列( )。
第 3 题 现有一个地址区间为 $0 - 10$ 的哈希表,当出现冲突情况,会往后找第一个空的地址存储(到 10 冲突了就从 0 开始往后),现在要依次存储 (1,3,5,7,9),哈希函数为 $h(x) = (x^2 +x) \mod 11$。其中 存储在哈希表哪个地址中 ( )。
第 4 题 在0/1背包问题中,给定一组物品,每个物品有一个重量和价值,背包的容量有限。假设背包的最大容量为 $W$,物品的数量为 $n$,其中第$i$个物品的重量为 $w_i$,价值为 $v_i$。以下关于0/1背包问题的描述,正确的是( )。
B. 0/1背包是P问题(多项式时间可解问题),它可以在$O(nW)$的时间复杂度内解决。
C. 0/1背包问题中,动态规划解法的空间复杂度为 $O(nW)$,但可以通过滚动数组技巧将空间复杂度优化到 $O(W)$。
第 5 题 一棵深度为 6 (根节点深度为 1 )的完全二叉树,节点总数最少有( )。
第 6 题 对于如下二叉树,下面关于访问的顺序说法错误的是( )。
第 7 题 下面程序的运行结果为( )。
#include <iostream>

int query(int n, int *a, int x) {
	int l = 0, r = n;
	while (l < r) {
		int mid = l + (r - l) / 2;
		if (a[mid] >= x) r = mid;
		else l = mid + 1;
	}
	
	if (l == n) return -1;
	return l;
}

int main() {
	int n = 10;
	int x = 3;
	int num[] = {1, 2, 2, 3, 3, 4, 5, 5, 6, 7};
	
	std::cout << query(n, num, x) << "\n";
	return 0;
}
第 8 题 下面程序中,函数 query 的时间复杂度是( )。
#include <iostream>

int query(int n, int *a, int x) {
	int l = 0, r = n;
	while (l < r) {
		int mid = l + (r - l) / 2;
		if (a[mid] >= x) r = mid;
		else l = mid + 1;
	}
	
	if (l == n) return -1;
	return l;
}

int main() {
	int n = 10;
	int x = 3;
	int num[] = {1, 2, 2, 3, 3, 4, 5, 5, 6, 7};
	
	std::cout << query(n, num, x) << "\n";
	return 0;
}
A. $O(1)$
B. $O(\log n)$
C. $O(n)$
D. $O(n \log n)$
第 9 题 有5个字符,它们出现的次数分别为2次、2次、3次、3次、5次。现在要用哈夫曼编码的方式来为这些字符进行编码,最小加权路径长度WPL(每个字符的出现次数$\times$它的编码长度,再把每个字符结果加起来)的值为( )。
第 10 题 下面程序的运行结果为( )。
#include <iostream>
using namespace std;
int f(int n) {
	if (n <= 2) return n * 2;
	return f(n - 1) + f(n - 2);
}
int main() {
	cout << f(5) << endl;
	return 0;
}
第 11 题 一个简单无向图 $G$ 有 36 条边,且每个顶点的度数都为 4 ,则图$G$的顶点个数为( )。
第 12 题 下面关于二叉树的说法正确的是( )。
C. 若二叉树有$n$个结点,根节点高度为$1$,则其高度$h$满足: $\lceil \log_2 (n+1) \rceil \le h \le n$。
第 13 题 假设一个算法时间复杂度的递推式是 $T(n) = 8T(n/4) + n \sqrt{n}$($n$为正整数),和 $T(0) = 1$,那么这个算法的时间复杂度是( )。
A. $O(n \sqrt{n})$
B. $O(n \sqrt{n}\log n)$
C. $O(n^2)$
D. $O(n^2 \log n)$
第 14 题 下面哪一个可能是下图的深度优先遍历序列( )。
第 15 题 下面这个有向图的强连通分量的个数是( )。
二、判断题(每题 2 分,共 20 分)
第 1 题 C++语言中,表达式 3 ^ 2的结果类型为 int,值为 9。
第 2 题 使用 cmath头文件中的正弦函数,表达式 sin(90) 的结果类型为 double,值约为 1.0。
第 3 题 使用 strcmp("10","9") 比较两个字符串,返回值大于0,说明"10"比"9"大。
第 4 题 选择排序是一种不稳定的排序算法,而冒泡排序是一种稳定的排序算法。
第 5 题 求两个长度为$n$序列的最长公共子序列(LCS)长度时,可以使用滚动数组将空间复杂度从$O(n^2)$优化到$O(n)$。
第 6 题 在无向图中,所有顶点的度数之和等于边数的两倍。
第 7 题 使用邻接矩阵存储一个有$V$个顶点、$E$条边的图,对该图进行一次完整的BFS遍历,时间复杂度为$O(V+E)$。
第 8 题 在图像处理或游戏开发中,泛洪(flood fill)算法既可以用BFS实现,也可以用DFS实现。
第 9 题 使用链地址法处理冲突的哈希表,当所有元素都映射到同一个槽位时,查找操作的最坏时间复杂度为$O(n)$,其中$n$为元素个数。
第 10 题 一个包含$V$个顶点的连通无向图,其任何一棵生成树都恰好包含$V-1$条边。
三、编程题(每题 25 分,共 50 分)
第 1 题 城市规划

题面描述

A国有 $n$ 座城市,城市之间由 $m$ 条双向道路连接,任意一座城市均可经过若干条双向道路到达另一座城市。城市依次以 $1, 2, \dots, n$ 编号。第 $i$ ($1 \le i \le m$)条双向道路连接城市 $u_i$ 与城市 $v_i$。

对于城市 $u$ 和城市 $v$ 而言,它们之间的连通度 $d(u, v)$ 定义为从城市 $u$ 出发到达城市 $v$ 所需经过的双向道路的最少条数。由于道路是双向的,可以知道连通度满足 $d(u, v) = d(v, u)$,特殊地有 $d(u, u) = 0$。

现在 A国正在规划城市建设方案。城市 $u$ 的建设难度为它到其它城市的最大连通度。请你求出建设难度最小的城市,如果有多个满足条件的城市,则选取其中编号最小的城市。形式化地,你需要求出使得 $\max_{1 \le i \le n} d(u, i)$ 最小的 $u$,若存在多个可能的 $u$ 则选取其中最小的。

输入格式

第一行,两个正整数 $n, m$,表示 A国的城市数量与双向道路数量。

接下来 $m$ 行,每行两个整数 $u_i, v_i$,表示一条连接城市 $u_i$ 与城市 $v_i$ 的双向道路。

输出格式

输出一行,一个整数,表示建设难度最小的城市编号。如果有多个满足条件的城市,则选取其中编号最小的城市。

输入数据#1 复制
3 3
1 2
1 3
2 3
输出数据#1 复制
1
输入数据#2 复制
4 4
1 2
2 3
3 4
2 4
输出数据#2 复制
2

数据要求

对于 $40\%$ 的测试点,保证 $1 \le n \le 300$。

对于所有测试点,保证 $1 \le n \le 2000$, $1 \le m \le 2000$, $1 \le u_i,v_i \le n$。

第 2 题 学习小组

题面描述

班主任计划将班级里的 $n$ 名同学划分为若干个学习小组,每名同学都需要分入某一个学习小组中。班级里的同学依次以 $1, 2, \dots, n$ 编号,第 $i$ 名同学有其发言积极度 $c_i$。

观察发现,如果一个学习小组中恰好包含编号为 $p_1, p_2, \dots, p_k$ 的 $k$ 名同学,则该学习小组的基础讨论积极度为 $a_k$,综合讨论积极度为 $a_k + \max\{c_{p_1},c_{p_2}, \dots, c_{p_k} \} - \min\{c_{p_1},c_{p_2}, \dots, c_{p_k}\}$,也即基础讨论积极度加上小组内同学的最大发言积极度与最小发言积极度之差。

给定基础讨论积极度 $a_1, a_2, \dots, a_n$,请你计算将这 $n$ 名同学划分为学习小组的所有可能方案中,综合讨论积极度之和的最大值。

输入格式

第一行,一个正整数 $n$,表示班级人数。

第二行,$n$ 个非负整数 $c_1, c_2, \dots, c_n$,表示每位同学的发言积极度。

第三行,$n$ 个非负整数 $a_1, a_2, \dots, a_n$,表示不同人数学习小组的基础讨论积极度。

输出格式

输出一行,一个整数,表示所有划分方案中,学习小组综合讨论积极度之和的最大值。

输入数据#1 复制
4
2 1 3 2
1 5 6 3
输出数据#1 复制
12
输入数据#2 复制
8
1 3 2 4 3 5 4 6
0 2 5 6 4 3 3 4
输出数据#2 复制
21

数据要求

对于 $40\%$ 的测试点,保证 $c_i = 0$。

对于所有测试点,保证 $1 \le n \le 300$, $0 \le c_i \le 10^4$, $0 \le a_i \le 10^4$。