GESP 客观题评测系统

试卷解析 · 理解每一步

2025-12-Level-8

2025-12-Level-8

试卷解析总览,可直接查看每题答案与解析。

单选题

第 1 题(单选题,2 分)

某平台生成“取件码”由6个字符组成:前4位为数字(0 - 9),后2位为大写字母(A - Z),其中字母不能为 I、O。假设数字和字母均可重复使用,要求整个取件码中恰好有2个数字为奇数。共有多少种不同取件码?( )

A.
1,440,000
B.
2,160,000
C.
2,535,000
D.
8,640,000

正确答案B

解析详情
答案 B位置组合与乘法原理
思路与推导
  1. 前四位恰好两位奇数,先选奇数位置,有 (42)=6\binom{4}{2}=6 种。每个奇数位置有 5 种数字,每个偶数位置也有 5 种,包含 0。

  2. 后两位字母各有 26−2=24 种,允许重复,因此总数为 6×54×242=21600006×5^4×24^2=2160000,选 B。

第 2 题(单选题,2 分)

下列代码实现了归并排序(Merge Sort)的分治部分。为了正确地将数组 a 的 [left, right] 区间进行排序,横线处应该填入的是()。

void merge_sort(int a[], int left, int right) {
    if (left >= right) return;
    int mid = (left + right) / 2;
    merge_sort(a, left, mid);
    ___; // 在此处填入选项
    merge(a, left, mid, right); // 合并操作
}
A.
merge_sort(a, mid, right)
B.
merge_sort(a, mid + 1, right)
C.
merge_sort(a, left, mid + 1)
D.
merge_sort(a, mid - 1, right)

正确答案B

解析详情
答案 B归并排序区间
思路与推导
  1. 本题区间 [left,right] 的两端都包含在内。左半已递归处理 [left,mid],因此右半必须从 mid+1 开始,到 right 结束。

  2. 应填 merge_sort(a,mid+1,right),选 B;两个区间不重叠并完整覆盖原范围。

第 3 题(单选题,2 分)

某社团有男生8人、女生7人。现需选出1名队长(性别不限)、1名副队长(性别不限)、2名宣传委员(两人无角色区别,且必须至少1名女生)。假如一人不能兼任多职,共有多少种不同选法?()

A.
12012
B.
11844
C.
12474
D.
11025

正确答案A

解析详情
答案 A带限制的角色选择
思路与推导
  1. 先选两名无区别的宣传委员,至少一名女生。可用全部两人组合减去全男组合:(152)−(82)=105−28=77\binom{15}{2}-\binom{8}{2}=105-28=77。

  2. 之后剩下 13 人选队长、12 人选副队长,两职务不同。

  3. 方案总数为 77×13×12=1201277×13×12=12012,选 A。

第 4 题(单选题,2 分)

二项式(2x−y)8(2x - y)^8的展开式中x5y3x^5 y^3项的系数为()。

A.
-7168
B.
7168
C.
-1792
D.
1792

正确答案C

解析详情
答案 C二项式系数与符号
思路与推导
  1. 要得到 x5y3x^5y^3,从 8 个因子中选 3 个取 −y,余下 5 个取 2x。

  2. 系数为 (83)×25×(−1)3=56×32×(−1)=−1792\binom{8}{3}×2^5×(-1)^3=56×32×(-1)=-1792,选 C。

第 5 题(单选题,2 分)

下面是使用邻接矩阵实现 Dijkstra 算法的核心片段,用于求单源最短路径。在找到当前距离起点最近的顶点 u 后,需要更新其邻接点 j 的距离。横线处应填入的代码是()。

for (int j = 1; j <= n; j++) {
    if (!visited[j] && graph[u][j] < INF) {
        if (_____) { // 在此处填入选项
            dis[j] = dis[u] + graph[u][j];
        }
    }
}
A.
dis[j] < dis[u] + graph[u][j]
B.
dis[j] > dis[u] + graph[u][j]
C.
graph[u][j] > dis[u] + dis[j]
D.
dis[j] > graph[u][j]

正确答案B

解析详情
答案 B最短路松弛
思路与推导
  1. 当前到 j 的距离是 dis[j],经 u 到 j 的新候选为 dis[u]+graph[u][j]。

  2. 只有当前距离大于这个候选时才应更新,因此选 B。若只比较边权 graph[u][j],会漏掉起点到 u 的路程。

第 6 题(单选题,2 分)

下面程序使用动态规划求两个字符串的最长公共子序列(LCS)长度,横线处应填入的是()。

#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int lcs_len(const string &a, const string &b) {
    int n = (int)a.size(), m = (int)b.size();
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            if (a[i - 1] == b[j - 1])
                dp[i][j] = dp[i - 1][j - 1] + 1;
            else
                // 在此处填入选项
    return dp[n][m];
}
A.
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
B.
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]);
C.
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
D.
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + 1;

正确答案C

解析详情
答案 CLCS 状态转移
思路与推导
  1. dp[i][j] 表示 a 的前 i 个字符与 b 的前 j 个字符的 LCS 长度。

  2. 末字符不同时,不能把它们配成新的一位,只能舍去 a 的末字符或 b 的末字符,在 dp[i−1][j] 与 dp[i][j−1] 中取最大值,选 C。

  3. 两末字符相同时才使用左上角状态加 1。

第 7 题(单选题,2 分)

已知两个点A(x1,y1)A(x_1, y_1)和B(x2,y2)B(x_2, y_2)在平面直角坐标系中的坐标。下列C++表达式中,能正确计算这两点之间直线距离的是( )。

A.
sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
B.
sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2))
C.
pow(x1 - x2, 2) + pow(y1 - y2, 2)
D.
abs(x1 - x2) + abs(y1 - y2)

正确答案B

解析详情
答案 B欧氏距离
思路与推导
  1. 横纵坐标差构成直角三角形的两条直角边,由勾股定理,距离为 (x1−x2)2+(y1−y2)2\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}。

  2. B 使用 pow 平方并求平方根,符合公式。D 是曼哈顿距离;C 少了开平方;A 的 ^ 是异或。

第 8 题(单选题,2 分)

已知 int a = 10;,执行 int &b = a; b = 20; 后,变量 a 的值是()。

A.
10
B.
20
C.
30
D.
编译错误

正确答案B

解析详情
答案 B引用别名
思路与推导
  1. int &b=a 使 b 成为 a 的引用,两者指向同一个被引用对象,并未复制生成独立整数。

  2. 执行 b=20 相当于给 a 赋值 20,所以 a 为 20,选 B。

第 9 题(单选题,2 分)

下列代码的时间复杂度(以n为自变量,忽略常数与低阶项)是()。

long long s = 0;
for (int i = 1; i <= n; i++) {
    for (int j = 1; j * j <= i; j++) {
        s += j;
    }
}
A.
O(n)O(n)
B.
O(nlog⁡n)O(n \log n)
C.
O(nn)O(n \sqrt{n})
D.
O(n2)O(n^{2})

正确答案C

解析详情
答案 C累加循环次数
思路与推导
  1. 固定 i 时,j 满足 j²≤i,内层执行 ⌊i⌋\lfloor\sqrt i\rfloor 次。总次数是 ∑i=1n⌊i⌋\sum_{i=1}^n\lfloor\sqrt i\rfloor。

  2. 上界为 n√n;而 i 从 n/2 到 n 的约 n/2 项,每项也是 √n 的常数倍,因此总量确为 Θ(nn)\Theta(n\sqrt n),选 C。

第 10 题(单选题,2 分)

下列程序实现了线性筛法(欧拉筛),用于在O(n)O(n)时间内求出1∼n1 \sim n之间的所有质数。为了保证每个合数只被其最小质因子筛掉,横线处应填入的语句是()。

for (int i = 2; i <= n; i++) {
    if (!not_prime[i]) primes[++cnt] = i;
    for (int j = 1; j <= cnt && i * primes[j] <= n; j++) {
        not_prime[i * primes[j]] = true;
        if (_____) break; // 在此处填入选项
    }
}
A.
i + primes[j] == n
B.
primes[j] > i
C.
i % primes[j] == 0
D.
i % primes[j] != 0

正确答案C

解析详情
答案 C线性筛唯一标记
思路与推导
  1. 质数按升序枚举。若 p=primes[j] 已整除 i,就在标记 i*p 后停止。

  2. 继续用更大质数 q 标记 i*q 时,这个乘积仍含更小质因子 p,将导致重复。因此在 i%primes[j]==0 时 break,选 C。

第 11 题(单选题,2 分)

在 C++ 语言中,关于类的继承和访问权限,下列说法正确的是()。

A.
派生类可以访问基类的 private 成员。
B.
基类的 protected 成员在私有继承(private inheritance)后,在派生类中变为 public 。
C.
派生类对象在创建时,会先调用基类的构造函数,再调用派生类自己的构造函数。
D.
派生类对象在销毁时,会先调用基类的析构函数,再调用派生类自己的析构函数。

正确答案C

解析详情
答案 C构造与析构顺序
思路与推导
  1. 派生类对象包含基类部分,必须先把基类部分构造完成,再执行派生类构造过程,所以 C 正确。

  2. 销毁时顺序相反,先执行派生类析构再析构基类。基类 private 成员不能被派生类直接访问,private 继承也不会将 protected 成员变成 public。

第 12 题(单选题,2 分)

当输入 6 时,下列程序的输出结果为()。

#include <iostream>
using namespace std;
int f(int n) {
    if (n <= 3) return n;
    return f(n - 1) + f(n - 2) + 2 * f(n - 3);
}
int main() {
    int n;
    cin >> n;
    cout << f(n) << endl;
    return 0;
}
A.
14
B.
27
C.
28
D.
15

正确答案B

解析详情
答案 B递推计算
思路与推导
  1. 基础值为 f(1)=1、f(2)=2、f(3)=3。

  2. 依次代入:f(4)=3+2+2×1=7;f(5)=7+3+2×2=14;f(6)=14+7+2×3=27。

  3. 输入 6 时输出 27,选 B。

图解 · 看懂这一步按 n 递增计算递归结果

左右滑动表格,可查看完整内容。

n计算f(n)
1直接返回1
2直接返回2
3直接返回3
43 + 2 + 2 × 17
57 + 3 + 2 × 214
614 + 7 + 2 × 327

基础值直接返回;后续每行只使用已经得到的前三项。

第 13 题(单选题,2 分)

从 1 到 999 这 999 个正整数中,十进制表示中数字 5 恰好出现一次的数有多少个?()

A.
243
B.
271
C.
300
D.
333

正确答案A

解析详情
答案 A恰好出现一次
思路与推导
  1. 把 1 到 999 都补为三位字符串,包括前导 0。先选择唯一数字 5 所在的位置,有 3 种。

  2. 其他两个位置不能是 5,各有 9 种选择,因此总数为 3×92=2433×9^2=243,选 A。000 本来不含 5,不会被计入。

第 14 题(单选题,2 分)

当输入 2023 时,下列程序的输出结果为()。

#include <iostream>
using namespace std;

int main() {
    int x, ans = 0;
    cin >> x;
    while (x != 0) {
        x -= x & -x;
        ans++;
    }
    cout << ans << endl;
    return 0;
}
A.
7
B.
8
C.
9
D.
11

正确答案C

解析详情
答案 Clowbit 与二进制计数
思路与推导
  1. 对正整数 x,x&−x 取得最低位的 1 对应的位权。每轮减去它,恰好清除一个二进制 1。

  2. 2023=1024+512+256+128+64+32+4+2+12023=1024+512+256+128+64+32+4+2+1,共有 9 项,即二进制 11111100111 含 9 个 1。

  3. 循环执行 9 次,输出 9,选 C。

第 15 题(单选题,2 分)

对连通无向图执行 Kruskal 算法。已按边权从小到大依次扫描到某条边e=(u,v)e = (u, v)。此时在已经构建的部分 MST 结构中,(u,v)(u, v)已在同一连通块内。关于边ee的处理,下列说法正确的是()。

A.
必须选入 MST,否则可能不连通。
B.
一定不能选入 MST(在此扫描顺序下)。
C.
若后续出现更大的边权,可以回溯改选ee。
D.
只有当ee是当前最小边时才能舍弃。

正确答案B

解析详情
答案 BKruskal 避环
思路与推导
  1. u 和 v 已在同一连通块,说明已选边中存在一条 u 到 v 的路径。

  2. 此时再加入 e 会闭合成环,违反生成树无环要求,因此在当前扫描过程中必须跳过 e,选 B。

  3. 即使边权相同、全图存在其他 MST,也不改变当前已选森林下的避环规则。

判断题

第 1 题(判断题,2 分)

若一项任务可用两种互斥方案完成:方案A有m种做法,方案B有n种做法,则总做法数为m+nm+n。

正确答案正确

解析详情
答案 正确加法原理
思路与推导
  1. 两类方案互斥,说明同一种完整做法不可能同时被 A、B 计数。

  2. 因此把 A 的 m 种与 B 的 n 种合并,恰好得到 m+n 种,判断正确。

第 2 题(判断题,2 分)

在C++语言中,引用一旦被初始化,就不能再改为引用另一个变量。

正确答案正确

解析详情
答案 正确引用绑定
思路与推导
  1. 引用初始化时确定被引用对象,之后不能重新绑定到另一个变量。

  2. 例如 int &r=a; 后执行 r=b,是把 b 的值赋给 a,而不是让 r 转为引用 b,所以题目正确。

第 3 题(判断题,2 分)

快速排序和归并排序的平均时间复杂度都是O(nlog⁡n)O(n \log n),但快速排序是不稳定的排序算法,归并排序是稳定的排序算法。

正确答案正确

解析详情
答案 正确排序稳定性与复杂度
思路与推导
  1. 标准快速排序的分区交换可能使相同关键字元素越过彼此,通常不稳定;标准归并在相等时优先取左半元素,可保持原相对次序,因此稳定。

  2. 两者平均处理各层区间的总工作量都为 O(nlog⁡n)O(n\log n),所以描述正确。

第 4 题(判断题,2 分)

使用 math.h 或 cmath 头文件中的函数,表达式 sqrt(4) 的结果类型为 double。

正确答案正确

解析详情
答案 正确sqrt 返回类型
思路与推导
  1. sqrt 计算实数平方根,即使传入整数 4,常见 cmath 整数参数调用也按浮点类型处理,结果为 double 的 2.0。

  2. 结果数值没有小数部分,并不会把返回类型变成 int,因此正确。

第 5 题(判断题,2 分)

在杨辉三角形中,第 n 行(从0开始计数,即第 n 行有n+1n+1个数)的所有数字之和等于2n2^{n}。

正确答案正确

解析详情
答案 正确杨辉三角行和
思路与推导
  1. 第 n 行从 0 计数时,各项为 (n0),(n1),…,(nn)\binom{n}{0},\binom{n}{1},\ldots,\binom{n}{n}。

  2. 在 (a+b)n(a+b)^n 中令 a=b=1,展开式各项相加即该行和,得到 (1+1)n=2n(1+1)^n=2^n,所以正确。

第 6 题(判断题,2 分)

使用二叉堆优化的Dijkstra最短路算法,在某些特殊情况下时间复杂度不如朴素实现的O(V2)O(V^{2})。

正确答案正确

解析详情
答案 正确稠密图与堆开销
思路与推导
  1. 二叉堆版本常见复杂度为 O((V+E)log⁡V)O((V+E)\log V)。若图很稠密,E 达到 V² 的数量级,标准分析给出 O(V2log⁡V)O(V^2\log V)。

  2. 朴素矩阵实现则为 O(V2)O(V^2),这类情况下堆优化可能不如朴素实现,因此正确。

第 7 题(判断题,2 分)

n 个不同元素依次入栈的出栈序列数与将 n 个不同元素划分成若干非空子集的方案数相等。

正确答案错误

解析详情
答案 错误不同组合数列
思路与推导
  1. 按固定顺序入栈的合法出栈序列数是 Catalan 数;将元素划分为非空无标号子集的方案数是 Bell 数。

  2. 取 n=4 即可区分:合法出栈序列有 14 种,而集合划分有 15 种,所以题目错误。

第 8 题(判断题,2 分)

快速排序在最坏情况下的时间复杂度为O(nlog⁡n)O(n \log n),可以通过随机化选择基准值(pivot)的方法完全避免退化。

正确答案错误

解析详情
答案 错误随机快速排序
思路与推导
  1. 快速排序遇到连续极不平衡划分时,最坏仍为 O(n2)O(n^2)。随机选 pivot 可使期望时间达到 O(nlog⁡n)O(n\log n),却仍可能碰巧连续选到极端元素。

  2. 因此不能“完全避免”退化,题目两项绝对表述都不正确。

第 9 题(判断题,2 分)

在C++语言中,一个类可以拥有多个构造函数,也可以拥有多个析构函数。

正确答案错误

解析详情
答案 错误构造与析构重载
思路与推导
  1. 在本题常规 C++ 类模型中,构造函数可以通过不同参数列表重载,例如 A() 和 A(int)。

  2. 析构函数不带参数,不能用同样方式重载,因此“也可以拥有多个析构函数”错误。

第 10 题(判断题,2 分)

求两个序列的最长公共子序列(LCS)时,使用滚动数组优化空间后,仍然可以还原出具体的LCS序列。

正确答案错误

解析详情
答案 错误滚动数组与路径信息
思路与推导
  1. 常见滚动数组只保留当前行和上一行的 LCS 长度,旧行及完整的转移方向会被覆盖。

  2. 因此计算结束后,仅凭通常的最终滚动数组不能像完整 DP 表那样直接回溯出序列,按题目默认语境判错误。

  3. 若允许重算或使用 Hirschberg 等额外算法,仍可在线性空间恢复 LCS;这不属于“只保留普通滚动数组即可回溯”。