一、单项选择题
(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
试卷解析 · 理解每一步
CSPJ-2026-R1-Mock-2
试卷解析总览,可直接查看每题答案与解析。
(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
在 C++ 中使用 `vector` 容器前,通常需要包含的头文件是( )。
正确答案C
`vector` 容器声明在标准头文件 `<vector>` 中。
表达式 `12 ^ 10` 的十进制结果为( )。
正确答案C
12 的二进制为 1100,10 为 1010,逐位异或得到 0110,即十进制 6。
内存地址最重要的特点是( )。
正确答案B
内存的每个可寻址单元都必须有唯一地址,处理器才能准确读写目标位置;连续性会因分页等机制而变化,不是最根本属性。
执行下面代码后,`x` 的值为( )。
int x = 1;
switch (x) {
case 1: x += 2;
case 3: x *= 2; break;
default: x = 0;
}正确答案D
进入 `case 1` 后先把 x 改为 3;由于没有 break,继续执行 `case 3`,得到 6。
二进制数 对应的十进制数是( )。
正确答案A
。
CPU 中( )相当于运算器中的一个存储单元,它的存取速度比存储器快得多。
正确答案D
寄存器位于 CPU 内部,用来暂存参与运算的数据、地址和状态,访问速度远高于主存和辅存,因此相当于运算器中的高速存储单元。
执行 `int a[5]={1,2,3,4,5}; cout << a[1]+a[3];` 后输出( )。
正确答案A
数组下标从 0 开始,`a[1]=2`、`a[3]=4`,两者之和为 6。
一棵有 15 个结点的满二叉树共有( )个叶结点。
正确答案C
满二叉树中叶结点数比内部结点数多 1;15 个结点对应 7 个内部结点和 8 个叶结点。
计算机中的数有浮点与定点两种,其中用浮点表示的数通常由( )组成。
正确答案C
浮点数类似科学记数法,由表示有效数字的尾数和表示缩放次数的阶码组成,数值可写成尾数乘以基数的阶码次幂。
一个 8 位有符号整数采用二进制补码表示时,其取值范围是( )。
正确答案A
8 位补码有 1 位符号及 7 位数值信息,范围为 到 ,即 -128 到 127。
下列叙述中,正确的是( )。
正确答案D
二维数组可看成元素本身又是线性表的线性表。队列是先进先出,栈是后进先出;顺序表和链表各有优缺点,不能笼统判定前者更优。
用某种排序方法对线性表 25, 84, 21, 47, 15, 27, 68, 35, 20 进行排序,节点变化如下:
(1) 25, 84, 21, 47, 15, 27, 68, 35, 20;
(2) 20, 15, 21, 25, 47, 27, 68, 35, 84;
(3) 15, 20, 21, 25, 35, 27, 47, 68, 84;
(4) 15, 20, 21, 25, 27, 35, 47, 68, 84。那么,排序方法是( )。
正确答案D
第一次变化后,枢轴 25 已就位,左侧元素不大于 25、右侧元素不小于 25;后续又分别对子区间做同样划分,符合快速排序的分区过程。
如果某二叉树的前序遍历序列为 STUWV,中序遍历序列为 UWTVS,那么该二叉树的后序遍历序列是( )。
正确答案A
前序首节点 S 是根,中序中 S 左侧全为左子树;左子树根为 T,其左子树由 U、W 构成,右子树为 V。按左、右、根得到后序 WUVTS。
下列关于数据结构的叙述中,正确的是( )。
正确答案D
树转换为二叉树时,左指针指向第一个孩子,右指针指向下一个兄弟。根节点没有兄弟,因此转换后的根节点没有右子树。
表达式 的后缀表达式为( )。
正确答案C
先把 写成 `1 34 +`,再与 5 相乘得到 `1 34 + 5 *`; 写成 `56 7 /`,最后执行减法,得到 `1 34 + 5 * 56 7 / -`。
程序输入不超过数组或字符串定义的范围;判断题正确填 ✓,错误填 ✗;除特殊说明外,判断题每题 2 分,选择题每题 3 分。
1 | #include <iostream>
2 | using namespace std;
3 | void hanoi(int n, char a, char b, char c) {
4 | if (n == 1)
5 | cout << n << "_" << a << "_" << c << endl;
6 | else {
7 | hanoi(n - 1, a, c, b);
8 | cout << n << "_" << a << "_" << c << endl;
9 | hanoi(n - 1, b, a, c);
10 | }
11 | }
12 | int main() {
13 | int n;
14 | cin >> n;
15 | hanoi(n, 'A', 'B', 'C');
16 | return 0;
17 | }当 时,程序不会出现死循环。
正确答案错误
当 时不满足 `n == 1`,程序会递归调用 `hanoi(-1, ...)`,之后参数继续减小,无法到达终止条件。
输出共有 行。
正确答案错误
设输出行数为 ,则 且 ,解得 ,并非 。
当 时,将第 4 行的 `==` 改为 `<=`,程序输出结果必定不变。
正确答案正确
在 的前提下,递归参数从 逐级减到 1,不会出现 0 或负数,因此把 `n == 1` 改成 `n <= 1` 仍在同一层终止,输出不变。
将第 5 行的 `n` 改为 `1`,程序输出结果必定不变。
正确答案正确
第 5 行只在 n == 1 的分支中执行,因此执行到这一行时 n 必然等于 1。把这里输出的 n 改成常量 1 不会改变任何输出。
此程序的时间复杂度是( )。
正确答案D
每个规模为 的调用产生两个规模为 的调用,并做常数次输出,递推式为 ,所以时间复杂度为 。
若要求输出不超过 15 行,则下列 值中( )是合法的。
正确答案B
正整数 时输出 行。 恰好输出 15 行; 均超过 15,而 会因缺少终止条件无限递归。
1 | #include <cstdio>
2 | #define N 1005
3 | using namespace std;
4 | int num[N];
5 | int main() {
6 | int a1 = 1, n, x;
7 | scanf("%d", &n);
8 | num[1] = 1;
9 | for (int i = 1; i <= n; ++i) {
10 | x = 0;
11 | for (int j = 1; j <= a1; ++j) {
12 | num[j] = num[j] * 5 + x;
13 | x = num[j] / 10;
14 | num[j] %= 10;
15 | }
16 | if (x > 0) num[++a1] = x;
17 | }
18 | printf("0.");
19 | for (int i = a1; i < n; ++i) putchar('0');
20 | for (int i = a1; i >= 1; i--) printf("%d", num[i]);
21 | putchar('\n');
22 | return 0;
23 | }程序输出的是 的值。
正确答案正确
数组保存 的十进制数字,程序在前面输出 0. 并补足到 位小数,因此整体数值为 。
第 19 行和第 20 行两个 `for` 循环中声明的变量 `i` 属于同一个局部变量。( )
正确答案错误
两个 `for` 循环都在循环头中重新声明 `int i`,每个变量的作用域仅覆盖各自循环,因此不是同一个局部变量。
程序运行过程中,数组有效数字位 `num[1]` 到 `num[a1]` 始终都在 0 到 9 之间。( )
正确答案正确
每次乘法后先用 `/10` 提取进位,再对当前位 `%10`,新产生的最高位也是一位十进制数,因此所有有效位始终在 0 到 9 之间。
程序输出的是一个小数,且小数末尾可能有多余的 0。
正确答案错误
程序输出 的恰好 位小数。 不含因子 2,十进制末位为 5,不会产生多余的末尾 0。
此程序的时间复杂度是( )。
正确答案B
外层循环执行 次,第 次需要处理 的全部十进制位,其位数与 成正比;总工作量为 。
若 ,则输出为( )。
正确答案B
时数组得到 ,程序在其前面输出 `0.`,且总共保留 3 位小数,所以最终输出 `0.125`。
1 | #include <iostream>
2 | using namespace std;
3 | int l, n, m, a[50005], ans;
4 | bool check(int dis) {
5 | int count = 0, last = 0;
6 | for (int i = 1; i <= n + 1; i++)
7 | if (a[i] - last < dis) count++;
8 | else last = a[i];
9 | if (count > m) return 0;
10 | return 1;
11 | }
12 |
13 | int main() {
14 | // 输入保证 l, n, m, a[i] 是正整数,且 a[i] 严格递增
15 | cin >> l >> n >> m;
16 | for (int i = 1; i <= n; i++) cin >> a[i];
17 | a[n + 1] = l;
18 | int fl = 0, fr = l;
19 | while (fl <= fr) {
20 | int mid = (fl + fr) / 2;
21 | if (check(mid)) fl = mid + 1, ans = mid;
22 | else fr = mid - 1;
23 | }
24 | cout << ans << endl;
25 | return 0;
26 | }将 `main()` 函数中 `while` 之前的 `fl = 0` 改为 `fl = 1`,程序输出结果必定不变。
正确答案正确
位置均为严格递增的正整数,合法方案的最小距离至少为 1,因此距离 0 无需成为最终答案;把二分下界从 0 改为 1 不影响最大可行距离。
程序结束前,必有 `fl > fr`。
正确答案正确
循环条件是 `fl <= fr`,每轮都会令 `fl = mid + 1` 或 `fr = mid - 1`。循环结束的唯一条件就是 `fl > fr`。
若主函数中执行 `check(mid)` 返回 1,则最终的 `ans` 小于或等于此时的 `mid`。
正确答案错误
当 `check(mid)` 返回 1 时,程序立即令 `ans = mid`,之后还会向更大的距离继续搜索,所以最终 `ans` 必定大于等于该 `mid`,而不是小于等于。
此程序的时间复杂度是( )。
正确答案C
`check` 顺序扫描 个位置,耗时 ;二分区间为 ,执行 次,因此总复杂度为 。
若输入如下,则输出为( )。
25 5 2
2 11 14 17 21正确答案B
距离 4 时可移除位置 2 和 14,保留 0、11、17、21、25,相邻距离均不少于 4。距离 5 时贪心至少需移除 2、14、21 三块石头,超过 ,故答案为 4。
(无权图最短路)给定一个 个顶点、 条边的无向图以及起点 ,使用 BFS 求起点到每个顶点的最少边数。不可达顶点的距离保持为 -1。
1 | #include <iostream>
2 | #include <queue>
3 | #include <vector>
4 | using namespace std;
5 | int main() {
6 | int n, m, s;
7 | cin >> n >> m >> s;
8 | vector<vector<int>> g(n + 1);
9 | for (int i = 0; i < m; ++i) {
10 | int u, v;
11 | cin >> u >> v;
12 | g[u].push_back(v);
13 | g[v].push_back(u);
14 | }
15 | vector<int> dist(n + 1, -1);
16 | queue<int> q;
17 | ① = 0;
18 | ②;
19 | while (!q.empty()) {
20 | int u = q.front();
21 | ③;
22 | for (int v : g[u]) {
23 | if (④) {
24 | ⑤;
25 | q.push(v);
26 | }
27 | }
28 | }
29 | for (int i = 1; i <= n; ++i)
30 | cout << dist[i] << (i == n ? '\n' : ' ');
31 | return 0;
32 | }① 处应填( )。
dist[1]dist[n]dist[s]dist[0]正确答案C
起点为 s,起点到自身距离为 0,因此设置 `dist[s]=0`。
② 处应填( )。
q.push(s)q.pop()q.push(n)q.front()正确答案A
搜索开始前应把起点 s 放入队列。
③ 处应填( )。
q.pop()q.push(u)q.back()dist[u] = -1正确答案A
读取队首顶点后要执行 `q.pop()` 将其移除,否则会反复处理同一顶点。
④ 处应填( )。
dist[v] == 0dist[v] == -1v == sdist[u] == -1正确答案B
距离初值 -1 表示尚未访问,只应把未访问顶点加入队列。
⑤ 处应填( )。
dist[v] = 0dist[v] = dist[u]dist[v] = dist[u] + 1dist[u] = dist[v] + 1正确答案C
从 u 沿一条边到 v,距离增加 1,因此首次访问 v 时设置 `dist[v]=dist[u]+1`。
(0-1 背包)有 件物品,背包容量为 。第 件物品重量为 、价值为 ,每件物品最多选择一次,求不超过容量时的最大总价值。
1 | #include <algorithm>
2 | #include <iostream>
3 | #include <vector>
4 | using namespace std;
5 | int main() {
6 | int n, V;
7 | cin >> n >> V;
8 | vector<int> dp(V + 1, ①);
9 | for (int i = 1; i <= ②; ++i) {
10 | int w, c;
11 | cin >> w >> c;
12 | for (int j = V; ③; --j)
13 | dp[j] = ④;
14 | }
15 | cout << ⑤ << '\n';
16 | return 0;
17 | }① 处应填( )。
0-1Vn正确答案A
不选择任何物品时,各容量下的最大价值初始为 0。
② 处应填( )。
nVn + Vw正确答案A
共有 n 件物品,外层循环应枚举 1 到 n。
③ 处应填( )。
j <= Vj > 0j >= wj >= c正确答案C
容量从 V 倒序枚举到当前物品重量 w,条件为 `j>=w`。
④ 处应填( )。
dp[j - w]dp[j] + cmin(dp[j], dp[j - w] + c)max(dp[j], dp[j - w] + c)正确答案D
容量 j 的最优值要在不选当前物品的 `dp[j]` 与选择后的 `dp[j-w]+c` 之间取最大。
⑤ 处应填( )。
dp[n]dp[V]Vdp[0]正确答案B
`dp[j]` 表示容量不超过 j 时的最大价值,目标容量为 V,因此输出 `dp[V]`。