2026年3月 GESP C++ 8级认证考试真题(含编程操作题部分)
选 单选题(共 15 题,每题 2 分)
某班级有8名男生和6名⼥生,现要选出3⼈组成学习小组,要求小组中至少有1名男生和1名⼥生,则不同的
选法共有( )种。
在杨辉三角中,从第0行开始计数,第10行的所有数之和为( )。
下列代码实现了快速幂算法,其时间复杂度为( )。
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;
}
从5本不同的数学书和4本不同的物理书中选取3本书,要求至少包含1本数学书,则不同的选法有( )种。
在二叉搜索树(BST)中,若中序遍历的序列为{1, 2, 3, 4, 5},且先序遍历的第一个序列元素为3,
则下列说法正确的是( )。
在一个有向带权图中,使用Dijkstra算法求单源最短路时,若使用优先队列(小根堆)优化,其时间复杂度为
( )。
对于含 个顶点( )的连通加权有向图,若图中不存在负权环,则任意两点之间的最短路径(简单路
径)最多包含( )条边。
在使用Floyd算法求任意两点间最短路径时,时间复杂度为 。若在某次算法执行前,已经用 Dijkstra 算
法正确求出了所有点对的最短路并存入了dist数组。如果此时继续对该dist数组执行一次完整的 Floyd 算法过程
(无任何提前终⽌),执行完毕后dist数组内的值( )。
关于图论中的最短路径算法,下列说法中严格正确的是( )。
有6个⼈排成一排照相,其中甲、⼄两⼈必须相邻,且丙不能站在排头的不同排法有( )种。
下列代码试图实现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];
}
用数字 0、1、2、3、4 组成无重复数字的五位偶数,共有( )个。
在一个无向带权图中,若使用 Prim 算法从顶点 0 开始构造最小生成树(边权均为正整数,且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;
}
已知三个点 在平面直角坐标系中的坐标。下列 C++ 表达式中,在精度误差范
围1e-8内能正确计算判断这三个点是三点共线的表达式是( )。
在64位操作系统下(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;
}
判 判断题(共 10 题,每题 2 分)
在C++中,若结构体中包含一个static成员变量,则该变量的存储空间属于结构体对象的一部分。( )
对于任意正整数 ,二项式 展开式中各项的二项式系数之和等于 。( )
在C++中,若函数参数类型为const int &,则该参数既可以绑定左值,也可以绑定右值。( )
若一个无向图的最小生成树唯一,则图中所有边权必定各不相同。( )
使用快速排序对 个元素进行排序时,无论最好、最坏还是平均情况,时间复杂度均为 。( )
若一个图中所有顶点的度数为偶数,则一定存在欧拉回路。( )
使用倍增法预处理区间最值问题时,预处理的时间复杂度为 ,查询的时间复杂度为 。( )
如果将一个连通无向图 中所有边的权值都统一增加同一个正整数常数 ,形成图 。则 的最小生成树
中每条边在 中对应的边组成的树,一定是 的最小生成树。( )
在图论算法中,Kruskal算法和Prim算法都可以用来求解最小生成树,且这两者的贪心策略无论在任何连通无
向图上求得的最小生成树总边权和必定相同。( )
在动态规划问题中,“状态转移方程+递推”和“递归+记忆化搜索”通常是解决同一问题的两种不同实现方
式,它们的时间复杂度总是相同的。( )
编 编程操作题(共 2 题,共 50 分)
试题名称:消息查找
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
⼩ A 的消息记录中有 条消息,依次以 编号。编号⼩的消息发送时间早于编号⼤的消息。
⼀条消息可以引⽤⼀条编号⼩于它的消息,也可以不引⽤消息。⼩ A 注意到消息记录⾥有引⽤的消息数量不会⾮常
多。消息记录的⼀个例⼦是:
【消息 1】小 A:有人做了今天的第一题吗?
【消息 2】小 A:我第一题 WA 了,可能是什么原因?
【消息 3:引用消息 1】小 B:我我我
【消息 4:引用消息 2】小 C:我也 WA 了
【消息 5:引用消息 2】小 B:是不是没开 long long?
【消息 6:引用消息 5】小 A:改了就 AC 了,太厉害了!
对于消息 ( ),⼩ A 以 标记消息 是否有引⽤,以及所引⽤的消息编号。如果 ,则消息 为引
⽤了消息 ;如果 ,则消息 没有引⽤消息。
消息记录⾥有⾮常多条消息。为了快速查找所需要的消息,⼩ A 准备实现⼀个简单的消息查找⼯具。消息查找⼯具
任意时刻只能定位恰好⼀条消息,如果当前位于消息 ( ),那么接下来可以选择以下两种操作之⼀:
定位到消息 ;
如果消息 引⽤了消息 ,定位到消息 。
以上操作可以执⾏任意次(包括零次)。
⼩ A 有 次询问。在第 ( )次询问中,⼩ A 给出消息编号 ( )。⼩ A 想知道,如果当前消
息查找⼯具位于 ,⾄少需要多少次操作才能定位到消息 。
输入格式
第⼀⾏,两个正整数 ,分别表⽰消息条数与询问次数。
第⼆⾏, 个⾮负整数 ,表⽰消息的引⽤关系,具体含义见题⽬描述。
接下来 ⾏中的第 ⾏( )包含两个正整数 ,表⽰⼀次询问。
保证⾄多只有 条引⽤消息。
输出格式
输出 ⾏,每⾏⼀个整数,表⽰将界⾯从消息 切换到消息 所需的最少操作次数。
数据范围
对于 的测试点,保证 , 。
对于所有测试点,保证 , , , ,保证⾄多有 条引⽤消息。
试题名称:⼦图最短路
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
给定包含 个结点 条边的带权⽆向图 ,结点依次以 编号。第 ( )条边连接编号为 与
的两个结点,权值为 。
对于指定的 ,按以下⽅式构造图 的⼦图 :
保留 中编号在区间 中的结点。删去其它编号不在 中的结点以及与之相连的边。剩余的结点和边构
成⼦图 。
对于 中的任意结点 应有 。记 在⼦图 上的最短距离为 。特殊地,若
在⼦图 上不连通,则认为 。
你需要求出 对 取模的结果。
题⽬中的英⽂字母 使⽤了特殊写法 ,以避免英⽂字母 与数字 混淆。
输入格式
第⼀⾏,两个正整数 ,表⽰结点数与边数。
接下来 ⾏,第 ( )⾏包含三个正整数 ,表⽰⼀条连接结点 的权值为 的边。
输出格式
输出⼀⾏,⼀个整数,表⽰ 对 取模的结果。
数据范围
对于 的测试点,保证 。
对于所有测试点,保证 , , , 。图中可能存在重边。