2025年12月 GESP C++ 7级
2025年12月 GESP C++ 7级认证考试真题(含编程操作题部分)
// questions
题目预览
下面关于 C++ 中形参、实参和定义域的说法中,正确的一项是( )。
形参是函数定义时所指定的变量,它只在函数内部有效。
在函数内部,可以修改传入的形参的值,即使该形参是一个常量引用。
实参和形参的类型必须完全一致,否则会导致编译错误。
使用指针作为形参时,形参是指向实参的地址,因此对该指针赋值会影响实参。
已知三个序列:s1={3,1,8,2,5,6,7,4}s1 = \{3, 1, 8, 2, 5, 6, 7, 4\}s1={3,1,8,2,5,6,7,4}, s2={1,5,1,8,6,4,7,5,6}s2 = \{1, 5, 1, 8, 6, 4, 7, 5, 6\}s2={1,5,1,8,6,4,7,5,6}, s3={1,8,3,5,7,6,2,4}s3 = \{1, 8, 3, 5, 7, 6, 2, 4\}s3={1,8,3,5,7,6,2,4}。以下哪个序列是它们的最长公共子序列( )。
{1,8,5,6}\{1, 8, 5, 6\}{1,8,5,6}
{1,5,6,7}\{1, 5, 6, 7\}{1,5,6,7}
{1,8,6}\{1, 8, 6\}{1,8,6}
{1,5,7,4}\{1, 5, 7, 4\}{1,5,7,4}
现有一个地址区间为 [0,9][0, 9][0,9] 的哈希表,当出现冲突情况,会往后找第一个空的地址存储(到 999 冲突了就从 000 开始往后),现在要依次存储 [3,5,2,9,1,8][3, 5, 2, 9, 1, 8][3,5,2,9,1,8],哈希函数为 h(x)=x%10h(x) = x \% 10h(x)=x%10。其中 888 存储在哈希表哪个地址中( )。
000
111
222
333
在 0/1 背包问题中,给定一组物品,每个物品有一个重量和价值,背包的容量有限。假设背包的最大容量为 WWW,物品的数量为 nnn,其中第 iii 个物品的重量为 wiw_iwi,价值为 viv_ivi。以下关于 0/1 背包问题的描述,正确的是( )。
在解决 0/1 背包问题时,使用贪心算法可以保证找到最优解,因为物品只能放入一次。
0/1 背包是 P 问题(多项式时间可解问题),它可以在 O(nW)O(nW)O(nW) 的时间复杂度内解决。
0/1 背包问题中,动态规划解法的空间复杂度为 O(nW)O(nW)O(nW),但可以通过滚动数组技巧将空间复杂度优化到 O(W)O(W)O(W)。
0/1 背包问题中,每个物品只能选择一次,并且子问题之间是独立的,无法重用计算结果。
一棵深度为 666(根节点深度为 111)的完全二叉树,节点总数最少有( )。
313131
323232
636363
646464
对于如下二叉树,下面关于访问的顺序说法错误的是( )。
DDD EEE BBB FFF HHH JJJ III GGG CCC AAA 是它的后序遍历序列。
AAA BBB CCC DDD EEE FFF GGG HHH III JJJ 是它的广度优先遍历序列。
AAA BBB DDD EEE CCC FFF GGG HHH III JJJ 是它的先序遍历序列。
DDD BBB EEE AAA FFF CCC HHH GGG JJJ III 是它的中序遍历序列。
下面程序的运行结果为( )。
#include <iostream>
int query(int n, int *a, int x) {
int l = 0, r = n;
while (l < r) {
int mid = l + (r - l) / 2;
if (a[mid] >= x) r = mid;
else l = mid + 1;
}
if (l == n) return -1;
return l;
}
int main() {
int n = 10;
int x = 3;
int num[] = {1, 2, 2, 3, 3, 4, 5, 5, 6, 7};
std::cout << query(n, num, x) << "\n";
return 0;
}
222
333
444
555
下面程序中,函数 query 的时间复杂度是( )。
#include <iostream>
int query(int n, int *a, int x) {
int l = 0, r = n;
while (l < r) {
int mid = l + (r - l) / 2;
if (a[mid] >= x) r = mid;
else l = mid + 1;
}
if (l == n) return -1;
return l;
}
int main() {
int n = 10;
int x = 3;
int num[] = {1, 2, 2, 3, 3, 4, 5, 5, 6, 7};
std::cout << query(n, num, x) << "\n";
return 0;
}
有 555 个字符,它们出现的次数分别为 222 次、222 次、333 次、333 次、555 次。现在要用哈夫曼编码的方式来为这些字符进行编码,最小加权路径长度 WPL(每个字符的出现次数 ×\times× 它的编码长度,再把每个字符结果加起来)的值为( )。
303030
343434
434343
474747
下面程序的运行结果为( )。
#include <iostream>
using namespace std;
int f(int n) {
if (n <= 2) return n * 2;
return f(n - 1) + f(n - 2);
}
int main() {
cout << f(5) << endl;
return 0;
}
101010
161616
262626
303030
一个简单无向图有 363636 条边,且每个顶点的度数都为 444,则图的顶点个数为( )。
999
121212
181818
363636
下面关于二叉树的说法正确的是( )。
任意二叉树的中序遍历与后序遍历必定不相同。
对任意二叉树,若已知先序遍历与后序遍历,则该二叉树唯一确定。
若二叉树有 nnn 个结点,根节点高度为 hhh,则其高度满足: h≤nh \leq nh≤n。
在二叉树的先序遍历中,根后紧跟的结点一定是根的左孩⼦。
假设一个算法时间复杂度的递推式是 T(n)=2T(n/2)+nT(n) = 2T(n/2) + nT(n)=2T(n/2)+n(nnn 为正整数),和 T(1)=1T(1) = 1T(1)=1,那么这个算法的时间复杂度是( )。
下面哪一个可能是下图的深度优先遍历序列( )。
111, 555, 666, 333, 222, 888, 999, 444, 777
111, 555, 888, 999, 777, 444, 666, 333, 222
333, 222, 111, 444, 777, 666, 999, 555, 888
222, 555, 666, 333, 888, 777, 999, 444, 111
下面这个有向图的强连通分量的个数是( )。
333
444
555
666
C++ 语言中,表达式 3 ^ 2 的结果类型为 int,值为 999。
使用 cmath 头文件中的正弦函数,表达式 sin(90) 的结果类型为 double,值约为 1.01.01.0。
使用 strcmp("10", "9") 比较两个字符串,返回值大于 000 ,说明 "10" 比 "9" 大。
选择排序是一种不稳定的排序算法,而冒泡排序是一种稳定的排序算法。
求两个长度为 nnn 的序列的最长公共子序列(LCS)长度时,可以使用滚动数组将空间复杂度从 O(n2)O(n^2)O(n2) 优化到 O(n)O(n)O(n)。
在无向图中,所有顶点的度数之和等于边数的两倍。
使用邻接矩阵存储一个有 nnn 个顶点、 mmm 条边的图,对该图进行一次完整的 BFS 遍历,时间复杂度为 O(n2)O(n^2)O(n2)。
在图像处理或游戏开发中,泛洪(flood fill)算法既可以用 BFS 实现,也可以用 DFS 实现。
使用链地址法处理冲突的哈希表,当所有元素都映射到同一个槽位时,查找操作的最坏时间复杂度为 O(n)O(n)O(n),其中 nnn 为元素个数。
一个包含 nnn 个顶点的连通无向图,其任何一棵生成树都恰好包含 n−1n-1n−1 条边。
试题名称:城市规划
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
A 国有 nnn 座城市,城市之间由 mmm 条双向道路连接,任意一座城市均可经过若干条双向道路到达另一座城市。城市依次以 1,2,…,n1,2,\ldots,n1,2,…,n 编号。第 iii(1≤i≤m1\le i\le m1≤i≤m)条双向道路连接城市 uiu_iui 与城市 viv_ivi。
对于城市 uuu 和城市 vvv 而言,它们之间的连通度 d(u,v)d(u,v)d(u,v) 定义为从城市 uuu 出发到达城市 vvv 所需经过的双向道路的最少条数。由于道路是双向的,可以知道连通度满足 d(u,v)=d(v,u)d(u,v)=d(v,u)d(u,v)=d(v,u),特殊地有 d(u,u)=0d(u,u)=0d(u,u)=0。
现在 A 国正在规划城市建设方案。城市 uuu 的建设难度为它到其它城市的最大连通度。请你求出建设难度最小的城市,如果有多个满足条件的城市,则选取其中编号最小的城市。形式化地,你需要求出使得 max1≤i≤nd(u,i)\max\limits_{1\le i\le n}d(u,i)1≤i≤nmaxd(u,i) 最小的 uuu,若存在多个可能的 uuu 则选取其中最小的。
输入格式
第一行,两个正整数 n,mn,mn,m,表示 A 国的城市数量与双向道路数量。
接下来 mmm 行,每行两个整数 ui,viu_i,v_iui,vi,表示一条连接城市 uiu_iui 与城市 viv_ivi 的双向道路。
输出格式
输出一行,一个整数,表示建设难度最小的城市编号。如果有多个满足条件的城市,则选取其中编号最小的城市。
样例输入 #1
3 3
1 2
1 3
2 3
样例输出 #1
1
样例输入 #2
4 4
1 2
2 3
3 4
2 4
样例输出 #2
2
说明/提示
对于 40%40\%40% 的测试点,保证 1≤n≤3001\le n\le 3001≤n≤300。
对于所有测试点,保证 1≤n≤20001\le n\le 20001≤n≤2000,1≤m≤20001\le m\le 20001≤m≤2000,1≤ui,vi≤n1\le u_i,v_i\le n1≤ui,vi≤n。
试题名称:学习小组
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
班主任计划将班级里的 nnn 名同学划分为若干个学习小组,每名同学都需要分入某一个学习小组中。班级里的同学依次以 1,2,…,n1,2,\ldots,n1,2,…,n 编号,第 iii 名同学有其发言积极度 cic_ici。
观察发现,如果一个学习小组中恰好包含编号为 p1,p2,…,pkp_1,p_2,\ldots,p_kp1,p2,…,pk 的 kkk 名同学,则该学习小组的基础讨论积极度为 aka_kak,综合讨论积极度为 ak+max{cp1,cp2,…,cpk}−min{cp1,cp2,…,cpk}a_k+\max\{c_{p_1},c_{p_2},\ldots,c_{p_k}\}−\min\{c_{p_1},c_{p_2},\ldots,c_{p_k}\}ak+max{cp1,cp2,…,cpk}−min{cp1,cp2,…,cpk},也即基础讨论积极度加上小组内同学的最大发言积极度与最小发言积极度之差。
给定基础讨论积极度 a1,a2,…,ana_1,a_2,\ldots,a_na1,a2,…,an,请你计算将这 nnn 名同学划分为学习小组的所有可能方案中,综合讨论积极度之和的最大值。
输入格式
第一行,一个正整数 nnn,表示班级人数。
第二行,nnn 个非负整数 c1,c2,…,cnc_1,c_2,\ldots,c_nc1,c2,…,cn,表示每位同学的发言积极度。
第三行,nnn 个非负整数 a1,a2,…,ana_1,a_2,\ldots,a_na1,a2,…,an,表示不同人数学习小组的基础讨论积极度。
输出格式
输出一行,一个整数,表示所有划分方案中,学习小组综合讨论积极度之和的最大值。
样例输入 #1
4
2 1 3 2
1 5 6 3
样例输出 #1
12
样例输入 #2
8
1 3 2 4 3 5 4 6
0 2 5 6 4 3 3 4
样例输出 #2
21
说明/提示
对于 40%40\%40% 的测试点,保证 ci=0c_i=0ci=0。
对于所有测试点,保证 1≤n≤3001\le n\le 3001≤n≤300,0≤ci≤1040\le c_i\le 10^40≤ci≤104,0≤ai≤1040\le a_i\le 10^40≤ai≤104。