试卷解析 · 理解每一步
2025-12-Level-8
2025-12-Level-8
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题,2 分)
某平台生成“取件码”由6个字符组成:前4位为数字(0 - 9),后2位为大写字母(A - Z),其中字母不能为 I、O。假设数字和字母均可重复使用,要求整个取件码中恰好有2个数字为奇数。共有多少种不同取件码?( )
正确答案B
解析详情
前四位恰好两位奇数,先选奇数位置,有 种。每个奇数位置有 5 种数字,每个偶数位置也有 5 种,包含 0。
后两位字母各有 26−2=24 种,允许重复,因此总数为 ,选 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); // 合并操作
}正确答案B
解析详情
本题区间 [left,right] 的两端都包含在内。左半已递归处理 [left,mid],因此右半必须从 mid+1 开始,到 right 结束。
应填 merge_sort(a,mid+1,right),选 B;两个区间不重叠并完整覆盖原范围。
第 3 题(单选题,2 分)
某社团有男生8人、女生7人。现需选出1名队长(性别不限)、1名副队长(性别不限)、2名宣传委员(两人无角色区别,且必须至少1名女生)。假如一人不能兼任多职,共有多少种不同选法?()
正确答案A
解析详情
先选两名无区别的宣传委员,至少一名女生。可用全部两人组合减去全男组合:。
之后剩下 13 人选队长、12 人选副队长,两职务不同。
方案总数为 ,选 A。
第 4 题(单选题,2 分)
二项式的展开式中项的系数为()。
正确答案C
解析详情
要得到 ,从 8 个因子中选 3 个取 −y,余下 5 个取 2x。
系数为 ,选 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];
}
}
}正确答案B
解析详情
当前到 j 的距离是 dis[j],经 u 到 j 的新候选为 dis[u]+graph[u][j]。
只有当前距离大于这个候选时才应更新,因此选 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];
}正确答案C
解析详情
dp[i][j] 表示 a 的前 i 个字符与 b 的前 j 个字符的 LCS 长度。
末字符不同时,不能把它们配成新的一位,只能舍去 a 的末字符或 b 的末字符,在 dp[i−1][j] 与 dp[i][j−1] 中取最大值,选 C。
两末字符相同时才使用左上角状态加 1。
第 7 题(单选题,2 分)
已知两个点和在平面直角坐标系中的坐标。下列C++表达式中,能正确计算这两点之间直线距离的是( )。
正确答案B
解析详情
横纵坐标差构成直角三角形的两条直角边,由勾股定理,距离为 。
B 使用 pow 平方并求平方根,符合公式。D 是曼哈顿距离;C 少了开平方;A 的 ^ 是异或。
第 8 题(单选题,2 分)
已知 int a = 10;,执行 int &b = a; b = 20; 后,变量 a 的值是()。
正确答案B
解析详情
int &b=a 使 b 成为 a 的引用,两者指向同一个被引用对象,并未复制生成独立整数。
执行 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;
}
}正确答案C
解析详情
固定 i 时,j 满足 j²≤i,内层执行 次。总次数是 。
上界为 n√n;而 i 从 n/2 到 n 的约 n/2 项,每项也是 √n 的常数倍,因此总量确为 ,选 C。
第 10 题(单选题,2 分)
下列程序实现了线性筛法(欧拉筛),用于在时间内求出之间的所有质数。为了保证每个合数只被其最小质因子筛掉,横线处应填入的语句是()。
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; // 在此处填入选项
}
}正确答案C
解析详情
质数按升序枚举。若 p=primes[j] 已整除 i,就在标记 i*p 后停止。
继续用更大质数 q 标记 i*q 时,这个乘积仍含更小质因子 p,将导致重复。因此在 i%primes[j]==0 时 break,选 C。
第 11 题(单选题,2 分)
在 C++ 语言中,关于类的继承和访问权限,下列说法正确的是()。
正确答案C
解析详情
派生类对象包含基类部分,必须先把基类部分构造完成,再执行派生类构造过程,所以 C 正确。
销毁时顺序相反,先执行派生类析构再析构基类。基类 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;
}正确答案B
解析详情
基础值为 f(1)=1、f(2)=2、f(3)=3。
依次代入:f(4)=3+2+2×1=7;f(5)=7+3+2×2=14;f(6)=14+7+2×3=27。
输入 6 时输出 27,选 B。
左右滑动表格,可查看完整内容。
| n | 计算 | f(n) |
|---|---|---|
| 1 | 直接返回 | 1 |
| 2 | 直接返回 | 2 |
| 3 | 直接返回 | 3 |
| 4 | 3 + 2 + 2 × 1 | 7 |
| 5 | 7 + 3 + 2 × 2 | 14 |
| 6 | 14 + 7 + 2 × 3 | 27 |
基础值直接返回;后续每行只使用已经得到的前三项。
第 13 题(单选题,2 分)
从 1 到 999 这 999 个正整数中,十进制表示中数字 5 恰好出现一次的数有多少个?()
正确答案A
解析详情
把 1 到 999 都补为三位字符串,包括前导 0。先选择唯一数字 5 所在的位置,有 3 种。
其他两个位置不能是 5,各有 9 种选择,因此总数为 ,选 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;
}正确答案C
解析详情
对正整数 x,x&−x 取得最低位的 1 对应的位权。每轮减去它,恰好清除一个二进制 1。
,共有 9 项,即二进制 11111100111 含 9 个 1。
循环执行 9 次,输出 9,选 C。
第 15 题(单选题,2 分)
对连通无向图执行 Kruskal 算法。已按边权从小到大依次扫描到某条边。此时在已经构建的部分 MST 结构中,已在同一连通块内。关于边的处理,下列说法正确的是()。
正确答案B
解析详情
u 和 v 已在同一连通块,说明已选边中存在一条 u 到 v 的路径。
此时再加入 e 会闭合成环,违反生成树无环要求,因此在当前扫描过程中必须跳过 e,选 B。
即使边权相同、全图存在其他 MST,也不改变当前已选森林下的避环规则。
判断题
第 1 题(判断题,2 分)
若一项任务可用两种互斥方案完成:方案A有m种做法,方案B有n种做法,则总做法数为。
正确答案正确
解析详情
两类方案互斥,说明同一种完整做法不可能同时被 A、B 计数。
因此把 A 的 m 种与 B 的 n 种合并,恰好得到 m+n 种,判断正确。
第 2 题(判断题,2 分)
在C++语言中,引用一旦被初始化,就不能再改为引用另一个变量。
正确答案正确
解析详情
引用初始化时确定被引用对象,之后不能重新绑定到另一个变量。
例如 int &r=a; 后执行 r=b,是把 b 的值赋给 a,而不是让 r 转为引用 b,所以题目正确。
第 3 题(判断题,2 分)
快速排序和归并排序的平均时间复杂度都是,但快速排序是不稳定的排序算法,归并排序是稳定的排序算法。
正确答案正确
解析详情
标准快速排序的分区交换可能使相同关键字元素越过彼此,通常不稳定;标准归并在相等时优先取左半元素,可保持原相对次序,因此稳定。
两者平均处理各层区间的总工作量都为 ,所以描述正确。
第 4 题(判断题,2 分)
使用 math.h 或 cmath 头文件中的函数,表达式 sqrt(4) 的结果类型为 double。
正确答案正确
解析详情
sqrt 计算实数平方根,即使传入整数 4,常见 cmath 整数参数调用也按浮点类型处理,结果为 double 的 2.0。
结果数值没有小数部分,并不会把返回类型变成 int,因此正确。
第 5 题(判断题,2 分)
在杨辉三角形中,第 n 行(从0开始计数,即第 n 行有个数)的所有数字之和等于。
正确答案正确
解析详情
第 n 行从 0 计数时,各项为 。
在 中令 a=b=1,展开式各项相加即该行和,得到 ,所以正确。
第 6 题(判断题,2 分)
使用二叉堆优化的Dijkstra最短路算法,在某些特殊情况下时间复杂度不如朴素实现的。
正确答案正确
解析详情
二叉堆版本常见复杂度为 。若图很稠密,E 达到 V² 的数量级,标准分析给出 。
朴素矩阵实现则为 ,这类情况下堆优化可能不如朴素实现,因此正确。
第 7 题(判断题,2 分)
n 个不同元素依次入栈的出栈序列数与将 n 个不同元素划分成若干非空子集的方案数相等。
正确答案错误
解析详情
按固定顺序入栈的合法出栈序列数是 Catalan 数;将元素划分为非空无标号子集的方案数是 Bell 数。
取 n=4 即可区分:合法出栈序列有 14 种,而集合划分有 15 种,所以题目错误。
第 8 题(判断题,2 分)
快速排序在最坏情况下的时间复杂度为,可以通过随机化选择基准值(pivot)的方法完全避免退化。
正确答案错误
解析详情
快速排序遇到连续极不平衡划分时,最坏仍为 。随机选 pivot 可使期望时间达到 ,却仍可能碰巧连续选到极端元素。
因此不能“完全避免”退化,题目两项绝对表述都不正确。
第 9 题(判断题,2 分)
在C++语言中,一个类可以拥有多个构造函数,也可以拥有多个析构函数。
正确答案错误
解析详情
在本题常规 C++ 类模型中,构造函数可以通过不同参数列表重载,例如 A() 和 A(int)。
析构函数不带参数,不能用同样方式重载,因此“也可以拥有多个析构函数”错误。
第 10 题(判断题,2 分)
求两个序列的最长公共子序列(LCS)时,使用滚动数组优化空间后,仍然可以还原出具体的LCS序列。
正确答案错误
解析详情
常见滚动数组只保留当前行和上一行的 LCS 长度,旧行及完整的转移方向会被覆盖。
因此计算结束后,仅凭通常的最终滚动数组不能像完整 DP 表那样直接回溯出序列,按题目默认语境判错误。
若允许重算或使用 Hirschberg 等额外算法,仍可在线性空间恢复 LCS;这不属于“只保留普通滚动数组即可回溯”。