信奥刷题站
GESP 认证 8级2025-09

2025年9月 GESP C++ 8级

题量
27 题
客观题
25 题
建议时长
60 分钟
卷面总分
100 分

2025年9月 GESP C++ 8级认证考试真题(含编程操作题部分)

开始整卷模拟计时作答 · 交卷即时判分 · 错题自动进错题本(需登录)2 道编程大题:在线只判客观题,编程题请自行前往洛谷等 OJ 提交验证

// questions

题目预览

1
单选题2

小杨想点一杯奶茶外卖,但还差 555 元起送。于是,小杨决定点一些小料。可选的小料包括:珍珠 111 元、椰果 222 元、奶冻 333 元、奶盖 444 元。每种小料最多点 111 份。请问共有多少种满足起送条件的点小料方案?( )。

A

161616

B

101010

C

999

D

777

2
单选题2

小杨和小刘是好朋友,她们在逛商场时发现新设置的大头贴自拍机,于是决定一起拍一组照片。一组照片包括 444 张,这 444 张照片没有顺序区分。拍每张照片时,可以选择有相框或无相框、两人可以分别选择有头饰或无头饰、还可以从 222 种位置(小杨在左,或小刘在左)中选出一种。她们不希望一组照片中出现完全相同的相框、头饰、位置的组合。请问一组照片共有多少种不同的方案?( )。

A

182018201820

B

707070

C

242424

D

161616

3
单选题2

下列关于 C++ 类的说法,错误的是( )。

A

派生类对象占用的内存总是不小于基类对象。

B

派生类可以不实现基类的虚函数。

C

如果一个类包含纯虚函数,则它不能包含成员变量。

D

如果一个类包含纯虚函数,则不能用它定义对象。

4
单选题2

下列关于树和图的说法,错误的是( )。

A

每个连通图都存在生成树。

B

每个存在生成树的有向图,都一定是强连通的。

C

保留树的所有节点,并把树的每个节点指向其父节点,则可以将树转换为一个有向弱连通图。

D

保留树的所有节点,并把树的每个节点指向其子节点,则可以将树转换为一个有向无环图。

5
单选题2

一对夫妻生男生女的概率相同。这对夫妻希望儿女双全。请问这对夫妻生下三个孩子时,实现儿女双全的概率是多少?( )。

A
B
C
D
6
单选题2

二项式 (x+2)6(x + 2)^6(x+2)6 的展开式中 x4x^4x4 项的系数是( )。

A

720720720

B

120120120

C

202020

D

151515

7
单选题2

对一个包含 nnn 个顶点、mmm 条边的图,执行广度优先搜索,其最优时间复杂度是( )。

A
B
C
D
8
单选题2

以下关于贪心法和动态规划的说法中,错误的是( )。

A

动态规划能解决大部分多阶段决策问题。

B

对特定的问题,贪心法不一定适用。

C

当特定的问题适用贪心法时,通常比动态规划的时间复杂度更低。

D

对很多问题,递推实现和递归实现动态规划方法的时间复杂度相当。

9
单选题2

下面程序的输出为( )。

#include <iostream>
using namespace std;
int main() {
    int N = 15, cnt = 0;
    for (int x = 1; x + x + x <= N; x++)
        for (int y = x; x + y + y <= N; y++)
            for (int z = y; x + y + z <= N; z++)
                cnt++;
    cout << cnt << endl;
    return 0;
}
A

454545

B

102102102

C

174174174

D

337533753375

10
单选题2

下面程序的时间复杂度为( )。

int primes[MAXP], num = 0;
bool isPrime[MAXN] = {false};
void sieve() {
    for (int n = 2; n <= MAXN; n++) {
        if (!isPrime[n])
            primes[num++] = n;
        for (int i = 0; i < num && n * primes[i] <= MAXN; i++) {
            isPrime[n * primes[i]] = true;
            if (n % primes[i] == 0)
                break;
        }
    }
}
A
B
C
D
11
单选题2

下列 Dijkstra 算法,假设图中顶点数 NNN 、边数 MMM ,则程序的时间复杂度为( )。

typedef struct Edge {
    int in, out; // 从下标in顶点到下标out顶点的边
    int len; // 边长度
    struct Edge * next;
} Edge;
// v:顶点个数,graph:出边邻接表,start:起点下标,dis:输出每个顶点的最短距离
void dijkstra(int v, Edge * graph[], int start, int * dis) {
    const int MAX_DIS = 0x7fffff;
    for (int i = 0; i < v; i++)
        dis[i] = MAX_DIS;
    dis[start] = 0;
    int * visited = new int[v];
    for (int i = 0; i < v; i++)
        visited[i] = 0;
    visited[start] = 1;
    for (int t = 0; ; t++) {
        int min = MAX_DIS, minv = -1;
        for (int i = 0; i < v; i++) {
            if (visited[i] == 0 && min > dis[i]) {
                min = dis[i];
                minv = i;
            }
        }
        if (minv < 0)
            break;
        visited[minv] = 1;
        for (Edge * e = graph[minv]; e != NULL; e = e->next)
            if (dis[e->out] > e->len)
                dis[e->out] = e->len;
    }
    delete[] visited;
}
A
B
C
D
12
单选题2

下面 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
B
C
D
13
单选题2

下面 merge_sort 函数试图实现归并排序算法,横线处应该填入的是( )。

#include <vector>
using namespace std;
void merge_sort(vector<int> & arr, int left, int right) {
    if (right - left <= 1)
        return;
    int mid = (left + right) / 2;
    merge_sort(________); // 在此处填入选项
    merge_sort(________); // 在此处填入选项
    vector<int> temp(right - left);
    int i = left, j = mid, k = 0;
    while (i < mid && j < right)
        if (arr[i] <= arr[j])
            temp[k++] = arr[i++];
        else
            temp[k++] = arr[j++];
    while (i < mid)
        temp[k++] = arr[i++];
    while (j < right)
        temp[k++] = arr[j++];
    for (i = left, k = 0; i < right; ++i, ++k)
        arr[i] = temp[k];
}
A
arr, left, mid
arr, mid, right
B
arr, left, mid + 1
arr, mid + 1, right
C
arr, left, mid
arr, mid + 1, right
D
arr, left, mid + 1
arr, mid + 1, right + 1
14
单选题2

下面 Prim 算法程序中,横线处应该填入的是( )。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int prim(vector<vector<int>> & graph, int n) {
    vector<int> key(n, INT_MAX);
    vector<int> parent(n, -1);
    key[0] = 0;
    for (int i = 0; i < n; i++) {
        int u = min_element(key.begin(), key.end()) - key.begin();
        if (key[u] == INT_MAX)
            break;
        for (int v = 0; v < n; v++) {
            if (__________) { // 在此处填入选项
                key[v] = graph[u][v];
                parent[v] = u;
            }
        }
    }
    int sum = 0;
    for (int i = 0; i < n; i++) {
        if (parent[i] != -1) {
            cout << "Edge: " << parent[i] << " - " << i << " Weight: " << key[i] << endl;
            sum += key[i];
        }
    }
    return sum;
}
int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> graph(n, vector<int>(n, 0));
    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        graph[u][v] = w;
        graph[v][u] = w;
    }
    int result = prim(graph, n);
    cout << "Total weight of the minimum spanning tree: " << result << endl;
    return 0;
}
A

graph[u][v] >= 0 && key[v] > graph[u][v]

B

graph[u][v] <= 0 && key[v] > graph[u][v]

C

graph[u][v] == 0 && key[v] > graph[u][v]

D

graph[u][v] != 0 && key[v] > graph[u][v]

15
单选题2

下面的程序使用出边邻接表表达的带权无向图,则从顶点 000 到顶点 333 的最短距离为( )。

#include <vector>
using namespace std;
class Edge {
    public:
    int dest;
    int weight;
    Edge(int d, int w) : dest(d), weight(w) {}
};
class Graph {
    private:
    int num_vertex;
    vector<vector<Edge>> vve;
    public:
    Graph(int v) : num_vertex(v), vve(v) {}
    void addEdge(int s, int d, int w) {
        vve[s].emplace_back(d, w);
        vve[d].emplace_back(s, w);
    }
};
int main() {
    Graph g(4);
    g.addEdge(0, 1, 8);
    g.addEdge(0, 2, 5);
    g.addEdge(1, 2, 1);
    g.addEdge(1, 3, 3);
    g.addEdge(2, 3, 7);
    return 0;
}
A

121212

B

111111

C

101010

D

999

16
判断题2

C++ 语言中,表达式 '9' ^ 3 的结果值为 '999'

17
判断题2

下列 C++ 语⾔代码,能够安全地输出 arr[5] 的值。

int n = 5;
int arr[n] = {1, 2, 3};
std::cout << arr[5];
18
判断题2

nnn 个元素的数组进行排序,最差情况的时间复杂度为 O(n2)O(n^2)O(n2)

19
判断题2

444 个红球、333 个蓝球和 222 个绿球排成一排(相同色球视为完全相同),则不同的排列方案数为 126012601260 种。

20
判断题2

使用 math.hcmath 头文件中的函数,对于 int 类型的变量 xxx,表达式 fabs(x)sqrt(x * x) 的结果总是近似相等的。

21
判断题2

运算符重载是 C++ 语⾔静态多态的一种典型体现,⽽使用 C 语⾔则无法实现运算符重载。

22
判断题2

存在一个简单无向图满足:顶点数为 666,边数为 888666 个顶点的度数分别为 333333333333222222

23
判断题2

已知两个 double 类型的变量 rrrthetathetatheta 分别表示一个扇形的圆半径及圆心角(弧度),则扇形的周长可以通过表达式 (2+theta)∗r(2 + theta) * r(2+theta)r 求得。

24
判断题2

Dijkstra 算法的时间复杂度为 O(n2)O(n^2)O(n2),其中 nnn 为图中顶点的数量。

25
判断题2

323232 名学生中选出 222 人分别担任男生班长和女生班长(男生班长必须是男生,女生班长必须是女生),则共有 种不同的选法。

GESP 编程操作题
26
编程题25

试题名称:最短距离

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

给定正整数 p,qp,qp,q 以及常数 N=1018N=10^{18}N=1018。现在构建一张包含 NNN 个结点的带权无向图,结点依次以 1,2,…,N1,2,\ldots,N1,2,,N 编号。对于任意满足 1≤u<v≤N1\le u<v\le N1u<vNu,vu,vu,v,向图中加入一条连接结点 uuu 与结点 vvv 的无向边,边权取决于 u,vu,vu,v 是否互质:

  • u,vu,vu,v 互质(即 u,vu,vu,v 的最大公因数为 111),则连接结点 uuu 与结点 vvv 的无向边长度为 ppp
  • 否则连接结点 uuu 与结点 vvv 的无向边长度为 qqq

现在给定 nnn 组询问,第 iii1≤i≤n1\le i\le n1in)组询问给定两个正整数 ai,bia_i,b_iai,bi,你需要回答结点 aia_iai 与结点 bib_ibi 之间的最短距离。

输入格式

第一行,三个正整数 n,p,qn,p,qn,p,q,分别表示询问数量,结点编号互质时的边权,以及结点编号不互质时的边权。

接下来 nnn 行,每行两个正整数 ai,bia_i,b_iai,bi,表示一组询问。

输出格式

输出共 nnn 行,每行一个整数,表示结点 aia_iai 与结点 bib_ibi 之间的最短距离。

样例输入 #1

4 4 3
1 2
2 3
4 2
3 5

样例输出 #1

4
4
3
4

样例输入 #2

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

样例输出 #2

2
2
4
2
0

说明/提示

对于 30%30\%30% 的测试点,保证 1≤n≤101\le n\le 101n101≤ai,bi≤501\le a_i,b_i\le 501ai,bi50

对于另外 30%30\%30% 的测试点,保证 1≤ai,bi≤2501\le a_i,b_i\le 2501ai,bi250

对于所有测试点,保证 1≤n≤1041\le n\le 10^41n1041≤ai,bi≤1091\le a_i,b_i\le 10^91ai,bi1091≤p,q≤1091\le p,q\le 10^91p,q109

本题为编程大题:请复制题面到洛谷 / GESP OJ 等平台编写并提交代码(本站不判分)
27
编程题25

试题名称:最小生成树

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

给定一张包含 nnn 个结点 mmm 条边的带权连通无向图,结点依次以 1,2,…,n1,2,\ldots,n1,2,,n 编号,第 iii 条边(1≤i≤m1\le i\le m1im)连接结点 uiu_iui 与结点 viv_ivi,边权为 wiw_iwi

对于每条边,请你求出从图中移除该条边后,图的最小生成树中所有边的边权和。特别地,若移除某条边后图的最小生成树不存在,则输出 −1-11

输入格式

第一行,两个正整数 n,mn,mn,m,分别表示图的结点数与边数。

接下来 mmm 行中的第 iii 行(1≤i≤m1\le i\le m1im)包含三个正整数 ui,vi,wiu_i,v_i,w_iui,vi,wi,表示图中连接结点 uiu_iui 与结点 viv_ivi 的边,边权为 wiw_iwi

输出格式

输出共 mmm 行,第 iii 行(1≤i≤m1\le i\le m1im)包含一个整数,表示移除第 iii 条边后,图的最小生成树中所有边的边权和。若移除第 iii 条边后图的最小生成树不存在,则输出 −1−11

样例输入 #1

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

样例输出 #1

14
15
-1
-1
10

样例输入 #2

6 10
1 2 6
2 3 3
3 1 4
3 4 5
4 5 8
5 6 2
6 4 1
3 2 4
5 4 4
3 3 6

样例输出 #2

15
16
17
-1
15
17
18
15
15
15

说明/提示

::cute-table{tuack}

子任务编号 测试点占比 nnn mmm 特殊性质
1 20%20\%20% ≤50\le 5050 ≤100\le 100100 -
2 30%30\%30% ≤105\le 10^5105 ≤105\le 10^5105 n=mn=mn=m
3 30%30\%30% ≤500\le 500500 ≤2×104\le 2\times 10^42×104 -
4 20%20\%20% ≤105\le 10^5105 ≤105\le 10^5105 -

对于所有测试点,保证 1≤n≤1051\le n\le 10^51n1051≤m≤1051\le m\le 10^51m1051≤ui,vi≤n1\le u_i,v_i\le n1ui,vin1≤wi≤1091\le w_i\le 10^91wi109

本题为编程大题:请复制题面到洛谷 / GESP OJ 等平台编写并提交代码(本站不判分)