2026年3月 GESP C++ 8级
2026年3月 GESP C++ 8级认证考试真题(含编程操作题部分)
// questions
题目预览
某班级有 888 名男生和 666 名女生,现要选出 333 人组成学习小组,要求小组中至少有 111 名男生和 111 名女生,则不同的选法共有( )种。
112112112
168168168
224224224
288288288
在杨辉三角中,从第 000 行开始计数,第 101010 行的所有数之和为( )。
512512512
102410241024
204820482048
409640964096
下列代码实现了快速幂算法,其时间复杂度为( )。
long long fastPow(long long b, long long e, long long mod) {
long long result = 1;
while (e > 0) {
if (e & 1)
result = result * b % mod;
b = b * b % mod;
e >>= 1;
}
return result;
}
从 555 本不同的数学书和 444 本不同的物理书中选取 333 本书,要求至少包含 111 本数学书,则不同的选法有( )种。
606060
747474
808080
848484
在二叉搜索树(BST)中,若中序遍历的序列为 {1,2,3,4,5}\{1, 2, 3, 4, 5\}{1,2,3,4,5},且先序遍历的第一个序列元素为 333,则下列说法正确的是( )。
该树一定是一棵完全二叉树
元素4和5不可能是兄弟节点
元素1所在节点的深度可能大于3(根节点深度为1)
元素2一定是元素1的⽗节点
在一个有向带权图中,使用 Dijkstra 算法求单源最短路时,若使用优先队列(小根堆)优化,其时间复杂度为( )。
对于含 nnn 个顶点(n≥1n \geq 1n≥1)的连通加权有向图,若图中不存在负权环,则任意两点之间的最短路径(简单路径)最多包含( )条边。
无法确定,取决于图的具体边数
在使用 Floyd 算法求任意两点间最短路径时,时间复杂度为 O(n3)O(n^3)O(n3) 。若在某次算法执行前,已经用 Dijkstra 算法正确求出了所有点对的最短路并存入了 dist 数组。如果此时继续对该 dist 数组执行一次完整的 Floyd 算法过程(无任何提前终止),执行完毕后 dist 数组内的值( )。
会发生改变,因为 Floyd 又做了一次松弛
不会发生改变
可能变大,因为未针对已有最短路优化
可能在某些负权图中陷入死循环
关于图论中的最短路径算法,下列说法中严格正确的是( )。
Dijkstra 算法能够高效处理包含负权边的有向图。
Floyd 算法可以求出任意两点间的最短路径,且允许图中存在负权边(但不能有负权环)。
单源最短路径算法无法用于无向图,无向图只能通过 BFS 求解。
Dijkstra 算法的每一步必定从当前未访问的节点中,选取距离起始点最远的节点进行松弛操作。
有 666 个人排成一排照相,其中甲、乙两人必须相邻,且丙不能站在排头的不同排法有( )种。
120120120
144144144
192192192
240240240
下列代码试图实现 Floyd 算法求所有点对之间的最短路径,横线处应填入( )。
void floyd(int n, int dist[][MAXN]) {
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (__________) // 在此处填入选项
dist[i][j] = dist[i][k] + dist[k][j];
}
dist[i][k] + dist[k][j] < dist[i][j]
dist[i][k] != INF && dist[k][j] != INF
dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]
dist[i][j] == INF
用数字 000 、 111 、 222 、 333 、 444 组成无重复数字的五位偶数,共有( )个。
484848
606060
727272
969696
在一个无向带权图中,若使用 Prim 算法从顶点 000 开始构造最小生成树(边权均为正整数,且 graph[u][v] == 0 表示无边),下列代码中横线处应填入( )。
int prim(vector<vector<int>>& graph, int n) {
vector<bool> inMST(n, false);
vector<int> minEdge(n, INT_MAX);
minEdge[0] = 0;
int result = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++)
if (!inMST[j] && (u == -1 || minEdge[j] < minEdge[u]))
u = j;
inMST[u] = true;
result += minEdge[u];
for (int v = 0; v < n; v++)
if (__________) // 在此处填入选项
minEdge[v] = graph[u][v];
}
return result;
}
graph[u][v] && !inMST[v] && graph[u][v] < minEdge[v]
!inMST[v] && graph[u][v] < minEdge[v]
graph[u][v] > 0 && !inMST[v]
!inMST[v] && minEdge[v] > 0
已知三个点在平面直角坐标系中的坐标。下列 C++ 表达式中,在精度误差范围 1e−81e-81e−8 内能正确计算判断这三个点是三点共线的表达式是( )。
(x2-x1)/(y2-y1) == (x3-x1)/(y3-y1)
(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1) == 0
fabs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)) < 1e-8
fabs((x2-x1)/(y2-y1)-(x3-x1)/(y3-y1)) < 1e-8
在 646464 位操作系统下(LP64 / LLP64 模型),下面代码的输出结果是()。
#include <iostream>
using namespace std;
int main() {
int a[4] = {1, 2, 3, 4};
int (*p)[4] = &a;
int *q = a;
cout << sizeof(a) << " ";
cout << sizeof(p) << " ";
cout << sizeof(p + 1) << " ";
cout << sizeof(q + 1) << " ";
cout << (p + 1) - p << " ";
cout << (q + 1) - q << endl;
}
161616 888 888 888 111 111
161616 888 161616 888 111 111
161616 888 888 444 444 111
161616 888 888 888 444 111
在 C++ 中,若结构体中包含一个 static 成员变量,则该变量的存储空间属于结构体对象的一部分。( )
对于任意正整数 nnn ,二项式 (a+b)n(a+b)^n(a+b)n 展开式中各项的二项式系数之和等于 2n2^n2n 。( )
在 C++ 中,若函数参数类型为 const int &,则该参数既可以绑定左值,也可以绑定右值。( )
若一个无向图的最小生成树唯一,则图中所有边权必定各不相同。( )
使用快速排序对 nnn 个元素进行排序时,无论最好、最坏还是平均情况,时间复杂度均为 O(nlogn)O(n \log n)O(nlogn)。( )
若一个图中所有顶点的度数为偶数,则一定存在欧拉回路。( )
使用倍增法预处理区间最值问题时,预处理的时间复杂度为 O(nlogn)O(n \log n)O(nlogn),查询的时间复杂度为 O(1)O(1)O(1)。( )
如果将一个连通无向图 GGG 中所有边的权值都统一增加同一个正整数常数 ccc,形成图 G′G'G′。则 GGG 的最小生成树中每条边在 G′G'G′ 中对应的边组成的树,一定是 G′G'G′ 的最小生成树。( )
在图论算法中,Kruskal 算法和 Prim 算法都可以用来求解最小生成树,且这两者的贪心策略无论在任何连通无向图上求得的最小生成树总边权和必定相同。( )
在动态规划问题中,“状态转移方程+递推”和“递归+记忆化搜索”通常是解决同一问题的两种不同实现方式,它们的时间复杂度总是相同的。( )
试题名称:消息查找
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
小 A 的消息记录中有 nnn 条消息,依次以 1,2,…,n1, 2, \dots, n1,2,…,n 编号。编号小的消息发送时间早于编号大的消息。
一条消息可以引用一条编号小于它的消息,也可以不引用消息。小 A 注意到消息记录里有引用的消息数量不会非常多。消息记录的一个例子是:
- 【消息 1】小 A:有人做了今天的第一题吗?
- 【消息 2】小 A:我第一题 WA 了,可能是什么原因?
- 【消息 3:引用消息 1】小 B:我我我
- 【消息 4:引用消息 2】小 C:我也 WA 了
- 【消息 5:引用消息 2】小 B:是不是没开 long long?
- 【消息 6:引用消息 5】小 A:改了就 AC 了,太厉害了!
对于消息 iii (1≤i≤n1 \le i \le n1≤i≤n),小 A 以 rir_iri 标记消息 iii 是否有引用,以及所引用的消息编号。如果 ri>0r_i > 0ri>0,则消息 iii 为引用了消息 rir_iri;如果 ri=0r_i = 0ri=0,则消息 iii 没有引用消息。
消息记录里有非常多条消息。为了快速查找所需要的消息,小 A 准备实现一个简单的消息查找工具。消息查找工具任意时刻只能定位恰好一条消息,如果当前位于消息 iii (1<i≤n1 < i \le n1<i≤n),那么接下来可以选择以下两种操作之一:
- 定位到消息 i−1i - 1i−1;
- 如果消息 iii 引用了消息 rir_iri,定位到消息 rir_iri。
以上操作可以执行任意次(包括零次)。
小 A 有 qqq 次询问。在第 kkk (1≤k≤q1 \le k \le q1≤k≤q) 次询问中,小 A 给出消息编号 xk,ykx_k, y_kxk,yk (yk<xky_k < x_kyk<xk)。小 A 想知道,如果当前消息查找工具位于 xkx_kxk,至少需要多少次操作才能定位到消息 yky_kyk。
输入格式
第一行,两个正整数 n,qn, qn,q,分别表示消息条数与询问次数。
第二行,nnn 个非负整数 r1,r2,…,rnr_1, r_2, \dots, r_nr1,r2,…,rn,表示消息的引用关系,具体含义见题目描述。
接下来 qqq 行中的第 kkk 行 (1≤k≤q1 \le k \le q1≤k≤q) 包含两个正整数 xk,ykx_k, y_kxk,yk,表示一次询问。
保证至多只有 1000 条引用消息。
输出格式
输出 qqq 行,每行一个整数,表示将界面从消息 xkx_kxk 切换到消息 yky_kyk 所需的最少操作次数。
样例输入 #1
6 3
0 0 1 2 2 5
4 1
6 2
6 3
样例输出 #1
2
2
3
样例输入 #2
5 5
0 0 0 1 3
4 1
4 2
5 1
5 2
5 3
样例输出 #2
1
2
2
2
1
说明/提示
数据范围
对于 40% 的测试点,保证 1≤n≤20001 \le n \le 20001≤n≤2000,1≤q≤20001 \le q \le 20001≤q≤2000。
对于所有测试点,保证 1≤n≤1051 \le n \le 10^51≤n≤105,1≤q≤1051 \le q \le 10^51≤q≤105,0≤ri<i0 \le r_i < i0≤ri<i,1≤yk<xk≤n1 \le y_k < x_k \le n1≤yk<xk≤n,保证至多有 1000 条引用消息。
试题名称:子图最短路
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
给定包含 nnn 个结点 mmm 条边的带权无向图 GGG,结点依次以 1,2,…,n1, 2, \dots, n1,2,…,n 编号。第 iii (1≤i≤m1 \le i \le m1≤i≤m) 条边连接编号为 uiu_iui 与 viv_ivi 的两个结点,权值为 wiw_iwi。
对于指定的 1≤ℓ≤r≤n1 \le \ell \le r \le n1≤ℓ≤r≤n,按以下方式构造图 GGG 的子图 G(ℓ,r)G(\ell, r)G(ℓ,r):
- 保留 GGG 中编号在区间 [ℓ,r][\ell, r][ℓ,r] 中的结点。删去其它编号不在 [ℓ,r][\ell, r][ℓ,r] 中的结点以及与之相连的边。剩余的结点和边构成子图 G(ℓ,r)G(\ell, r)G(ℓ,r)。
对于 G(ℓ,r)G(\ell, r)G(ℓ,r) 中的任意结点 u,vu, vu,v 应有 ℓ≤u,v≤r\ell \le u, v \le rℓ≤u,v≤r。记 u,vu, vu,v 在子图 G(ℓ,r)G(\ell, r)G(ℓ,r) 上的最短距离为 d(ℓ,r,u,v)d(\ell, r, u, v)d(ℓ,r,u,v)。特殊地,若 u,vu, vu,v 在子图 G(ℓ,r)G(\ell, r)G(ℓ,r) 上不连通,则认为 d(ℓ,r,u,v)=0d(\ell, r, u, v) = 0d(ℓ,r,u,v)=0。
你需要求出 ∑ℓ=1n∑r=ℓn∑u=ℓr∑v=urd(ℓ,r,u,v)\sum_{\ell=1}^{n} \sum_{r=\ell}^{n} \sum_{u=\ell}^{r} \sum_{v=u}^{r} d(\ell, r, u, v)∑ℓ=1n∑r=ℓn∑u=ℓr∑v=urd(ℓ,r,u,v) 对 10910^9109 取模的结果。
- 题目中的英文字母 lll 使用了特殊写法 ℓ\ellℓ,以避免英文字母 lll 与数字 111 混淆。
输入格式
第一行,两个正整数 n,mn, mn,m,表示结点数与边数。
接下来 mmm 行,第 iii (1≤i≤m1 \le i \le m1≤i≤m) 行包含三个正整数 ui,vi,wiu_i, v_i, w_iui,vi,wi,表示一条连接结点 ui,viu_i, v_iui,vi 的权值为 wiw_iwi 的边。
输出格式
输出一行,一个整数,表示 ∑ℓ=1n∑r=ℓn∑u=ℓr∑v=urd(ℓ,r,u,v)\sum_{\ell=1}^{n} \sum_{r=\ell}^{n} \sum_{u=\ell}^{r} \sum_{v=u}^{r} d(\ell, r, u, v)∑ℓ=1n∑r=ℓn∑u=ℓr∑v=urd(ℓ,r,u,v) 对 10910^9109 取模的结果。
样例输入 #1
3 2
1 2 1
2 3 2
样例输出 #1
9
样例输入 #2
4 6
1 2 100
2 3 100
3 4 100
1 3 10
2 4 10
1 4 1
样例输出 #2
784
说明/提示
对于 40%40\%40% 的测试点,保证 2≤n≤202 \le n \le 202≤n≤20。
对于所有测试点,保证 2≤n≤1002 \le n \le 1002≤n≤100,2≤m≤n(n−1)22 \le m \le \frac{n(n-1)}{2}2≤m≤2n(n−1),1≤ui,vi≤n1 \le u_i, v_i \le n1≤ui,vi≤n,1≤wi≤1061 \le w_i \le 10^61≤wi≤106。图中可能存在重边。