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

一、单选题(每题 2 分,共 30 分)
第 1 题 已知小写字母 b 的ASCII码为98,下列C++代码的输出结果是( )。
#include <iostream>
using namespace std;
int main() {
	char a = 'b' + 1;
	cout << a;
	return 0;
}
第 2 题 已知 a 为 int 类型变量, p 为 int * 类型变量,下列表达式不符合语法的是( )。
第 3 题 下列关于C++类的说法,错误的是( )。
第 4 题 已知数组 a 的定义 int a[10] = {-1}; ,下列说法不正确的是( )。
第 5 题 一棵完全二叉树有165个结点,则叶结点有多少个?( )
第 6 题 下列关于二叉树的说法,错误的是( )。
C. $n$个元素的二叉排序树,其高一定为 $\lfloor \log_2n \rfloor $。
第 7 题 下列关于树和图的说法,错误的是( )。
第 8 题 对一个包含 $V$ 个顶点、 $E$ 条边的图,执行广度优先搜索,其最优时间复杂度是( )。
A. $O(V+E)$
B. $O(V)$
C. $O(E)$
D. $O(V^2)$
第 9 题 以下哪个方案不能合理解决或缓解哈希表冲突( )。
第 10 题 以下关于贪心法和动态规划的说法中,错误的是( )。
第 11 题 下面程序的输出为( )。
#include <iostream>
using namespace std;
int fib(int n) {
	if (n == 0)
		return 1;
	return fib(n - 1) + fib(n - 2);
}
int main() {
	cout << fib(6) << endl;
	return 0;
}
第 12 题 下面程序的时间复杂度为( )。
int rec_fib[MAX_N];
int fib(int n) {
	if (n <= 1)
		return n;
	if (rec_fib[n] != 0)
		return rec_fib[n];
	return fib(n - 1) + fib(n - 2);
}
A. $O(\phi^n), \phi = \frac{\sqrt{5}+1}{2}$
B. $O(2^n)$
C. $O(n^2)$
D. $O(n)$
第 13 题 下面 init_sieve 函数的时间复杂度为( )。
int sieve[MAX_N];
void init_sieve(int n) {
	for (int i = 1; i <= n; i++)
		sieve[i] = i;
	for (int i = 2; i <= n; i++)
		for (int j = i; j <= n; j += i)
			sieve[j]--;
}
A. $O(n)$
B. $O(n \log \log n)$
C. $O(n \log n)$
D. $O(n^2)$
第 14 题 下面 count_triple 函数的时间复杂度为( )。
int gcd(int m, int n) {
	if (m == 0) return n;
	return gcd(n % m, m);
}
int count_triple(int n) {
	int cnt = 0;
	for (int v = 1; v * v * 4 <= n; v++)
		for (int u = v + 1; u * (u + v) * 2 <= n; u += 2)
			if (gcd(u, v) == 1) {
				int a = u * u - v * v;
				int b = u * v * 2;
				int c = u * u + v * v;
				cnt += n / (a + b + c);
			}
	return cnt;
}
A. $O(n^2)$
B. $O(n^2 \log n)$
C. $O(n \log n)$
D. $O(n)$
第 15 题 下列选项中,哪个不可能是下图的深度优先遍历序列( )。
二、判断题(每题 2 分,共 20 分)
第 1 题 C++语言中,表达式 9 && 12 的结果类型为 int 、值为 8 。
第 2 题 C++语言中,在有 int a[10]; 定义的范围内,通过表达式 a[-1] 进行访问将导致编译错误。
第 3 题 选择排序一般是不稳定的。
第 4 题 C++语言中, float 和 int 类型一般都是 4 字节,因此 float 类型能够表达不同的浮点数值的数量,与 int 类型能够表达不同的整数值的数量是相同的。
第 5 题 使用 math.h 或 cmath 头文件中的对数函数,表达式 log(256) 的结果类型为 double 、值约为 8.0 。
第 6 题 一棵有 $N$ 个节点的完全二叉树,则树的深度为 $\lfloor \log_2(N) \rfloor +1$。( )
第 7 题 邻接表和邻接矩阵都是图的存储形式。通常,使用邻接表比使用邻接矩阵的时间复杂度更低。
第 8 题 C++语言中,类的构造函数可以声明为私有(private)。
第 9 题 泛洪算法的递归实现容易造成溢出,因此大的二维地图算法中,一般使用广度优先搜索实现。
第 10 题 很多游戏中为玩家设置多种可供学习的技能,要学习特定技能又往往需要先学习1个或以上的前置技能。尽管这样的技能间依赖关系常被玩家称为“技能树”,但它并不一定是树,更可能是有向无环图。
三、编程题(每题 25 分,共 50 分)
第 1 题 连通图

题面描述

给定一张包含 $n$ 个结点与 $m$ 条边的无向图,结点依次以 $1,2,\cdots,n$ 编号,第 $i$ 条边( $1 \le i \le m$ )连接结点 $u_i$ 与结点 $v_i$ 。如果从一个结点经过若干条边可以到达另一个结点,则称这两个结点是连通的。

你需要向图中加入若干条边,使得图中任意两个结点都是连通的。请你求出最少需要加入的边的条数。

注意给出的图中可能包含重边与自环。

输入格式

第一行,两个正整数 $n,m$,表示图的点数与边数。

接下来 $m$ 行,每行两个正整数 $u_i,v_i$,表示图中一条连接结点 $u_i$ 与结点 $v_i$ 的边。

输出格式

输出一行,一个整数,表示使得图中任意两个结点连通所需加入的边的最少数量。

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

数据要求

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

对于所有测试点,保证 $1 \le n \le 10^5$,$1 \le m \le 10^5$ 。

第 2 题 金币收集

题面描述

小 A 正在游玩收集金币的游戏。具体来说,在数轴上将会出现 $n$ 枚金币,其中第 $i$ 枚( $1 \le i \le n$ )金币将会在时刻 $t_i$出现在数轴上坐标为 $x_i$ 的位置。小 A 必须在时刻 $t_i$ 恰好位于坐标 $x_i$,才可以获得第 $i$ 枚金币。

游戏开始时为时刻 $0$,此时小 A 的坐标为 $0$。正常来说,小 A 可以按游戏机的按键在数轴上左右移动,但不幸的是游戏机的左方向键失灵了。小 A 每个时刻只能选择保持不动,或是向右移动一个单位。换言之,如果小 A 在时刻 $t$ 的坐标为 $x$,那么他在时刻 $t+1$ 的坐标只能是 $x$ 或是 $x+1$ 二者之一,分别对应保持不动和向右移动。

小 A 想知道他最多能收集多少枚金币。你能帮他收集最多的金币吗?

输入格式

第一行,一个正整数 $n$,表示金币的数量。

接下来 $n$ 行,每行两个正整数 $x_i,t_i$,分别表示金币出现的坐标与时刻。

输出格式

输出一行,一个整数,表示小 A 最多能收集的金币数量。

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

数据要求

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

对于另外 $30$% 的测试点,保证 $1 \le n \le 100$,$1 \le x_i \le 100$,$1 \le t_i \le 100$ 。

对于所有测试点,保证 $1 \le n \le 10^5$,$1 \le x_i \le 10^9$ ,$1 \le t_i \le 10^9$ 。