2024年6月 GESP C++ 8级认证考试真题(含编程操作题部分)
选 单选题(共 15 题,每题 2 分)
GESP 活动期间,举办方从获胜者 ABCDE 五个⼈中选出三个⼈排成一队升国旗,其中 A 不能排在队首,请问有多少种排法?
$7$ 进制数 $235$ 转换成 $3$ 进制数是( )。
$0$,$1$,$2$,$3$,$4$,$5$ 这些数字组成一个三位数,请问没有重复数字的情况下,有多少种组法( )。
有 $V$ 个顶点、$E$ 条边的图的深度优先搜索遍历时间复杂度为( )。
一对夫妻生男生女的概率相同。已知这对夫妻有两个孩子,其中一个是女孩,另一个是男孩的概率是多少?
从 $1$ 到 $2024$ 这 $2024$ 个数中,共有( )个包含数字 $6$ 的数。
二进制数 $100.001$ 转换成十进制数是( )。
以下函数声明,哪个是符合 C++ 语法的?( )。
下面有关 C++ 重载的说法,错误的是( )。
小于或等于给定正整数 $n$ 的数中,与 $n$ 互质的数的个数,我们称为欧拉函数,记作 $\varphi(n)$ 。下面说法错误的是( )。
已知一棵二叉树有 $10$ 个节点,则其中至多有( )个节点有 $2$ 个子节点。
二项展开式的系数,正好满足杨辉三角的规律。当 $n = 5$ 时,二项式展开式中 $x^3$ 项的系数是( )。
下面程序的时间复杂度为( )。
bool notPrime[N] = {false};
void sieve() {
for (int n = 2; n * n < N; n++)
if (!notPrime[n])
for (int i = n * n; i < N; i += n)
notPrime[i] = true;
}
下面程序的最差时间复杂度为( )。
int gcd(int m, int n) {
if (m == 0)
return n;
return gcd(n % m, m);
}
下面程序的输出为( )。
#include <iostream>
using namespace std;
int main() {
int cnt = 0;
for (int x = 0; x <= 10; x++)
for (int y = 0; y <= 10; y++)
for (int z = 0; z <= 10; z++)
if (x + y + z <= 15)
cnt++;
cout << cnt << endl;
return 0;
}
判 判断题(共 10 题,每题 2 分)
$A$ $B$ $C$ $D$ $E$ 五个小朋友,排成一队跑步,其中 $A$ $B$ 两人必须排在一起,一共有 $48$ 种排法。
已知 double 类型的变量 $a$ 和 $b$,则执行语句 a = a + b; b = a - b; a = a - b; 后,变量 $a$ 和 $b$ 的值会互换。
一个袋子中有 $3$ 个完全相同的红色小球、$2$ 个完全相同的蓝色小球。每次从中取出 $1$ 个,再放回袋子,这样进行 $3$ 次后,可能的颜色顺序有 $8$ 种。
已知 int 类型的变量 $a$ 和 $b$ 中分别存储着一个直角三角形的两条直角边的长度,则斜边的长度可以通过表达式 sqrt(a * a + b * b) 求得。
在一个包含 $v$ 个顶点、$e$ 条边的带权连通简单有向图上使用 Dijkstra 算法求最短路径,时间复杂度为 $O(v^2)$,可进一步优化至 $O(e + v \log v)$。
在 $n$ 个元素的二叉排序树中查找一个元素,最差情况的时间复杂度是 $O(n)$。
C++ 语言中,可以为同一个类定义多个析构函数。
使用单链表和使用双向链表,查找元素的时间复杂度相同。
为解决哈希函数冲突,可以使用不同的哈希函数为每个表项各建立一个子哈希表,用来管理该表项的所有冲突元素。这些子哈希表一定不会发生冲突。
要判断无向图的连通性,在深度优先搜索和广度优先搜索中选择,深度优先的平均时间复杂度更低。
编 编程操作题(共 2 题,共 50 分)
试题名称:最远点对
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
小杨有一棵包含 $n$ 个节点的树,这棵树上的任意一个节点要么是白色,要么是黑色。
小杨想知道相距最远的一对不同颜色节点的距离是多少。
输入格式
第一行包含一个正整数 $n$,代表树的节点数。
第二行包含 $n$ 个非负整数 $a_1,a_2,\cdots,a_n$(对于所有的 $1\le i\le n$,均有 $a_i$ 等于 $0$ 或 $1$),其中如果 $a_i=0$,则节点 $i$ 的颜色为白色;如果 $a_i=1$,则节点 $i$ 的颜色为黑色。
之后 $(n-1)$ 行,每行包含两个正整数 $x_i,y_i$,代表存在一条连接节点 $x_i$ 和 $y_i$ 的边。
保证输入的树中存在不同颜色的点。
输出格式
输出一个整数,代表相距最远的一对不同颜色节点的距离。
样例输入 #1
5
0 1 0 1 0
1 2
1 3
3 4
3 5
样例输出 #1
3
说明/提示
样例解释
相距最远的不同颜色的一对节点为节点 $2$ 和 $5$。
数据范围
本题采用捆绑测试。
| 子任务编号 | 得分 | $n$ | $a_i$ | 特殊条件 |
| :--: | :--: | :--: | :--: | :--: |
| $1$ | $30$ | $\le 10^5$ | $0\le a_i\le 1$ | 树的形态为一条链 |
| $2$ | $30$ | $\le 10^3$ | $0\le a_i\le 1$ | |
| $3$ | $40$ | $\le 10^5$ | $0\le a_i\le 1$ | |
对于全部数据,保证有 $1\le n\le 10^5$,$0\le a_i\le 1$。
试题名称:空间跳跃
时间限制:1.0 s | 内存限制:500.0 MB
题目描述
小杨在二维空间中有 $n$ 个水平挡板,并且挡板之间彼此不重叠,其中第 $i$ 个挡板处于水平高度 $h_i$,左右端点分别位于 $l_i$ 与 $r_i$。
小杨可以在挡板上左右移动,当小杨移动到右端点时,如果再向右移动会竖直掉落,从而落到下方第一个挡板上,移动到左端点时同理。小杨在挡板上每移动 $1$ 个单位长度会耗费 $1$ 个单位时间,掉落时每掉落 $1$ 个单位高度也会耗费 $1$ 个单位时间。
小杨想知道,从第 $s$ 个挡板上的左端点出发到第 $t$ 个挡板需要耗费的最少时间是多少?
注意:可能无法从第 $s$ 个挡板到达到第 $t$ 个挡板。
输入格式
第一行包含一个正整数 $n$,代表挡板数量。
第二行包含两个正整数 $s,t$,含义如题面所示。
之后 $n$ 行,每行包含三个正整数 $l_i,r_i,h_i$,代表第 $i$ 个挡板的左右端点位置与高度。
输出格式
输出一个整数代表需要耗费的最少时间,如果无法到达则输出 $-1$。
样例输入 #1
3
3 1
5 6 3
3 5 6
1 4 100000
样例输出 #1
100001
说明/提示
样例解释
耗费时间最少的移动方案为,从第 $3$ 个挡板左端点移动到右端点,耗费 $3$ 个单位时间,然后向右移动掉落到第 $2$ 个挡板上,耗费 $100000-6=99994$ 个单位时间,之后再向右移动 $1$ 个单位长度,耗费 $1$ 个单位时间,最后向右移动掉落到第 $1$ 个挡板上,耗费 $3$ 个单位时间。共耗费 $100001$ 个单位时间。
数据范围
子任务编号|数据点占比|$n$|特殊条件
:-:|:-:|:-:|:-:
$1$|$20%$|$\leq 1000$|$l_i=1$
$2$|$40%$|$\leq 1000$|$l_i=i,r_i=i+1$
$3$|$40%$|$\leq 1000$|
对于全部数据,保证有 $1\leq n\leq 1000$,$1\leq l_i\leq r_i\leq 10^5$,$1\leq h_i\leq 10^5$。