试卷解析 · 理解每一步
提高组 CSP-S 2026 初赛模拟卷 7
CSPS-2026-R1-Mock-7
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题,2 分)
表达式 转后缀表达式的结果是()。
正确答案B
解析详情
先算 b+c,bc+;再算 a*(b+c),abc+*;再算 d/f,abc+*df/,最后得 abc+x-df/。
第 2 题(单选题,2 分)
以下字符串中,字典序最小的是()。
正确答案A
解析详情
前缀 NOIP 都一样,直接比较 2、C、C、P,根据 ASCII 码值,字符 2(十进制 50)最小。
第 3 题(单选题,2 分)
在 C++ 中,表达式 ('O' - 'I') ^ 13 % 9 + 5 的值是()。
正确答案D
解析详情
∧是异或运算符。位运算优先级较低,先算('O'-'I')=6,13%9=4,再算4+5=9,最后算6^9=15。
第 4 题(单选题,2 分)
已知数组 A 中,每个元素 A[i,j] 在存储时要占 3 字节,设 i 从 1 变化到 8,j 从 1 变化到 10,分配内存时是从地址 SA 开始连续按行存储分配的。A[5,8] 的起始地址为()。
正确答案A
解析详情
对于数组地址计算问题,只要掌握数据是顺序存储的并占用连续的存储空间。本题是按行分配空间,一般数组下标是从 0 开始,但题目中说明了本题下标从 1 开始,则 A[5,8] 前 4 行共 40 个单元,第 5 行 A[5,1] 至 A[5,7] 共 7 个单元,即 A[5,8] 前有 47 个单元,其地址是 SA+(47*3)= SA+141。
第 5 题(单选题,2 分)
在 TCP/IP 协议族中,最核心的网络协议是()。
正确答案D
解析详情
IP 协议是 TCP/IP 协议的核心。
第 6 题(单选题,2 分)
应用快速排序的分治思想可以实现一个求第 K 大数的程序。假定不考虑极端的最坏情况,在平均情况下算法的期望时间复杂度为()。
正确答案C
解析详情
求第 K 大数,可以在序列中先随机选取一个数,然后将比这个数小的移到这个数的左边,其余的移到右边,然后可以判断出第 K 大的数在哪一侧,递归处理即可。每次期望将数据规模缩减一半,时间复杂度为 。
第 7 题(单选题,2 分)
为解决计算机主机与外设之间速度不匹配的问题,通常会设置一个缓冲池。主机将输出数据依次写入该缓冲池,而外设从该缓冲池中依次取出数据。该缓冲池应该是一个( )结构。
正确答案B
解析详情
主机将计算机输出的数据依次写入该缓冲区,而外设从该缓冲区中取出数据。需要先进先出,保持顺序不变,因此是队列的结构。
第 8 题(单选题,2 分)
(1E34) - (676) 的结果是()。
正确答案D
解析详情
十六进制 1E34 转十进制: ,八进制 676 转十进制: ,7732 - 446 = 7286。逐个计算各选项转十进制的值,发现一致的是选项 D。 。
第 9 题(单选题,2 分)
一棵二叉树的前序遍历序列为 ABDECFGH,后序遍历序列为 EDBGFHCA。下列选项中,( ) 不是可能的中序遍历序列。
正确答案C
解析详情
已知“中序 + 前序”或“中序 + 后序”可以唯一确定二叉树结构,但“前序 + 后序”不行。一种做法是对每个选项与题面的前序,画出二叉树,再验证后序。讨巧的办法是首先确定 A 是根节点,发现四个选项中 A 左右值的集合是一样的,所以左子树包含 B、D、E,右子树包含 C、F、G、H。同理可再确定 A 的左子节点是 B,右子节点是 C。这时候剩下的情况已经不多了,稍微画一下就能确定。
第 10 题(单选题,2 分)
一个栈的输入序列为 12345,下列序列中,( ) 不可能是栈的输出序列。
正确答案B
解析详情
有 “3-1-2” 型子序列的就是不可能的,如 B 选项中的 413。
第 11 题(单选题,2 分)
Linux 是一个用 C 语言写成的开源计算机操作系统内核,有大量的操作系统是基于 Linux 内核创建的。以下操作系统中,( )使用的不是 Linux 内核。
正确答案C
解析详情
Windows 使用的不是 Linux 内核。
第 12 题(单选题,2 分)
下列关于计算机算法的说法中,正确的是()。
正确答案D
解析详情
A:不断降低算法复杂度显然不可能;B:衡量算法应该在逻辑上,而不是特定机器上,因
为机器环境也会影响同一算法的运行速度;C:可以没有输入;D:克雷数学研究所公布的七个千禧年数学难题之一,目前没有人解出。
第 13 题(单选题,2 分)
以下关于二叉树性质的描述中,正确的是()。
正确答案A
解析详情
A: 正确,每出现一个度为2的节点,就会减少一个连通分支;B: 至多有 个节点;C: 只有1个孤立点的树就满足;D: 具有 个节点的完全二叉树的深度为 。
第 14 题(单选题,2 分)
排序算法是稳定的,这句话的意思是,排序前后,关键码相同的记录的相对位置不发生改变。以下排序算法不稳定的是()。
正确答案B
解析详情
常识。快速排序因为每次轴点后直接跳到特定位置,所以不保证不会越过同值的位置。
第 15 题(单选题,2 分)
给定 m 种颜色和有 n 个点的手环,要求用这 m 种颜色给这条手环着色。若两种着色方案可通过旋转或翻转相互得到,则视为同一种着色方案,如对于有 3 个点的手环,ABC 的着色方案与 BCA(旋转)、ACB(翻转)视为同一种方案。当 m=2 且 n=2 时,一共有 3 种着色方案,分别为 AA、AB、BB。那么当 m=5 且 n=4 时,一共有( )种着色方案。
正确答案D
解析详情
本题正解是波利亚定理,如果你知道这个知识点,那么所有翻转和旋转组合后,置换群的置换一共有以下几个:(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3),(1,4,3,2),(2,1,4,3),(3,2,1,4),(4,3,2,1),分解后的循环数分别为4,1,2,1,3,2,3,2。根据波利亚定理,答案为: 。
但波利亚定理是超纲知识点,如果不会,那就只能分组硬算。
染1种颜色:5种;
染2种颜色:1112、1212、1122、1222,计 种;
染3种颜色:1123、1213、2213、2123、3312、3132,计 种;
染4种颜色:圆排列,计 种。
二、阅读程序(1)
#include <iostream>
using namespace std;
unsigned short tot;
void Hanoi(int n, char A, char B, char C) {
++tot;
if (n == 1) {
cout << A << "->" << C << "/";
return;
}
Hanoi(n - 1, A, C, B);
cout << A << "->" << C << "/";
Hanoi(n - 1, B, A, C);
}
int main() {
int n;
cin >> n;
Hanoi(n, 'A', 'B', 'C');
cout << '\n' << tot << '\n' << tot << '\n';
return 0;
}第 16 题(判断题,3 分)
将 ++tot 移到 Hanoi() 函数返回之前的最后一行,输出结果不会发生变化。 ( )
正确答案错误
解析详情
如果这样修改,n==1 时 ++tot 不会执行,输出会变小。
第 17 题(判断题,3 分)
输入的 n=2 时,输出的第一行为 A -> B/B -> C/A -> C/。 ( )
正确答案错误
解析详情
直接模拟即可。或注意到题面中的移动方法是非法的,会将大圆环压在小圆环上。
第 18 题(判断题,3 分)
输入的 n=3 时,输出的第二行为 8。 ( )
正确答案错误
解析详情
移动次数 , ,所以 。
第 19 题(判断题,3 分)
本程序的含义可以是:有三根柱子,第一根柱子从上到下依次套有编号为 的圆环,现在每次可以移动某根柱子顶部的圆环到另一根柱子的顶部,并要求编号较大的圆环始终不能在编号较小的上面,输出一种操作次数最少的方案以及对应的操作次数。 ()
正确答案正确
解析详情
经典的汉诺塔问题,函数命名就是提示。
二、阅读程序(2)
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
const int N = 105;
int a[N][N];
int main() {
int n, x, y, count;
cin >> n;
memset(a, 0, sizeof(a));
count = a[x = 0][y = n - 1] = 1;
while (count < n * n) {
while (x + 1 < n && !a[x + 1][y]) a[++x][y] = ++count;
while (y - 1 >= 0 && !a[x][y - 1]) a[x][--y] = ++count;
while (x - 1 >= 0 && !a[x - 1][y]) a[--x][y] = ++count;
while (y + 1 < n && !a[x][y + 1]) a[x][++y] = ++count;
}
for (x = 0; x < n; x++) {
for (y = 0; y < n; y++) cout << setw(5) << a[x][y];
cout << endl;
}
return 0;
}第 20 题(判断题,2 分)
删除 memset(a, 0, sizeof(a));,不影响程序运行结果。 ()
正确答案正确
解析详情
a 数组在全局定义,所以默认都为零。
第 21 题(判断题,2 分)
将 while (count < n*n) 改为 while (count <= n*n),不影响程序运行结果。 ( )
正确答案错误
解析详情
因为 a[0][n-1] 已经填上 1,count 表示已经填入了几个数,count == n*n 时已经填满,继续执行会进入死循环。
第 22 题(判断题,2 分)
输入的 n=4 时,程序输出的 a[3][2] 的值为 15。 ()
正确答案错误
解析详情
输出结果如下,a[3][2]=5(代码中下标范围是 0~n-1)。
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
第 23 题(单选题,4 分)
本程序的时间复杂度为()。
正确答案B
解析详情
count 每轮至少增加一,所以不会高于 ,从题意逻辑也容易得到结果。
第 24 题(单选题,4 分)
(4分)输入的 n=100 时,a[33][66] 的值为()。
正确答案D
解析详情
选项 C 可直接排除,其他三个选项只能靠计算了。第 i 圈一共有 个数。而 a[33][66] 是第 34 圈的第一个数, 圈共有 = 8844 个数,所以 a[33][66] = 8845。
二、阅读程序(3)
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
string s;
int main() {
int k; // 保证输入 0 <= k < 26
cin >> k >> s;
int n = s.length();
for (int i = 0; i < n; i++) {
if (s[i] <= 'Z' && s[i] + k > 'Z')
s[i] = (s[i] + k) % 'Z' + 'A' - 1;
else if ('A' <= s[i] && s[i] <= 'Z')
s[i] += k;
}
char pre;
int st = -1;
for (int i = 0; i < n; i++) {
if (s[i] < 'A' || s[i] > 'Z') {
if (st == -1) {
st = i;
pre = s[i];
} else {
char tmp = s[i];
s[i] = pre;
pre = tmp;
}
}
}
if (st != -1) s[st] = pre;
cout << s << endl;
return 0;
}第 25 题(判断题,2 分)
删除 if (st != -1) s[st] = pre;,不影响程序运行结果。 ()
正确答案错误
解析详情
st 要赋回最后一个非字母的值,否则就不是循环位移。用一个例子模拟也可以说明,例如输入 s="ab" 即可。
第 26 题(判断题,2 分)
如果输入的 s 不含大写字母,则输出结果与 k 的值无关。 ()
正确答案正确
解析详情
第一个 for 循环里两个 if 都不会命中。其实 char pre;这句前后部分的逻辑是独立的(输出 s 除外)。
第 27 题(判断题,2 分)
如果知道输出结果,能够反推出唯一的输入。 ()
正确答案错误
解析详情
还需要知道 k。
第 28 题(判断题,2 分)
当 k 的值确定时,不存在两个不同的输入使得输出相同。 ()
正确答案正确
解析详情
当 k 确定时,一个输出到输出是双射,不管值还是下标上的循环位移都是可逆的。
第 29 题(单选题,3 分)
如果输入是 6 KU96APY5,则输出为()。
正确答案B
解析详情
模拟即可。这里盯第一位和最后一位最方便。第一位 ,最后一位显然不再是 5,这样就能确定是选项 B 了。
第 30 题(单选题,3 分)
如果输出是 ab1287F2Tguz,则输入可能为()。
正确答案C
解析详情
可逐个代入验证。讨巧方法:选项 A 什么都没改肯定不对,非大写字母要位移;选项 B 直接少了一个字符;选项 C 和 D 只有大写部分不一致,验证一下即可。
三、完善程序(1)
(拓扑排序)在我们所学的课程中,部分课程之间可能存在依赖关系,如我们在学习图论知识之前,需要先学习离散数学的基础知识。一门课可能有若干先修课程。现在老师需要安排一些课程的授课计划,排课需要遵从一定的规则,即只有修习完某课程的全部先修课程后,才能修习该课程。在本例中,用1~n表示n门课程,用xy表示x是y的先修课程。输入数据保证图中没有环与重边。要求输出任意一个可行的授课顺序。图用邻接矩阵方法存储。
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 105;
int a[N][N];
int in[N], s[N];
int n, m, u, v;
void Topo() {
queue<int> q;
int cnt = 0;
for (int i = 1; i <= n; i++)
if (①) q.push(i);
while (!q.empty()) {
int cur = q.front();
q.pop();
s[cnt++] = ②;
for (int i = 1; i <= n; i++) {
if (③) {
④;
if (in[i] == 0) q.push(i);
}
}
}
}
int main() {
memset(in, 0, sizeof(in));
memset(a, 0, sizeof(a));
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> u >> v;
in[v]++;
⑤;
}
Topo();
for (int i = 0; i < n; i++) {
if (i) cout << ' ';
cout << s[i];
}
cout << endl;
return 0;
}第 31 题(单选题,3 分)
①处应填()。
in[i] == 0in[i] == 1a[i][u] == 0a[i][u] == 1正确答案A
解析详情
拓扑排序开始应当将入度为0的节点加入队列中。
第 32 题(单选题,3 分)
②处应填()。
q.front()curq.back()s[cur]正确答案B
解析详情
将当前队首的节点插入到当前拓扑序的末尾。
第 33 题(单选题,3 分)
③处应填( )。
!--in[i]a[u][v] == 1a[cur][i] == 1!in[i]正确答案C
解析详情
判断 cur 和 i 之间有没有连边,a 是邻接矩阵。
第 34 题(单选题,3 分)
④处应填()。
in[i]++in[i]--q.pop()q.push(cur)正确答案B
解析详情
删掉 cur → i,i 的入度减一。
第 35 题(单选题,3 分)
⑤处应填()。
in[u]++in[u]--a[u][v] = 1a[v][u] = 1正确答案C
解析详情
有向边在邻接矩阵中标记为 1,代表有路相连。
三、完善程序(2)
(八皇后问题)要求用回溯法求解八皇后问题:在 的棋盘上放置八个皇后,确保任意两个皇后都不在同一行、同一列或同一斜线上。请输出八皇后问题的所有可行解。
#include <iostream>
#include <cmath>
using namespace std;
bool Place(int k, int i, int *x) {
for (int j = 0; j < k; j++)
if (x[j] == i || ①)
return false;
return true;
}
void NQueens(int k, int n, int *x) {
for (int i = 0; i < n; i++)
if (Place(k, i, x)) {
②;
if (③) {
for (int j = 0; j < n; j++) cout << x[j] << " ";
cout << endl;
} else {
④;
}
}
}
int main() {
int x[8];
for (int i = 0; i < 8; i++) x[i] = -1;
⑤;
return 0;
}第 36 题(单选题,3 分)
① 处应填()。
x[j] == i - 1abs(x[j] - i) <= 1abs(x[j] - k) == i - jabs(x[j] - i) == k - j正确答案D
解析详情
判断 和 是否在一条斜线上。
第 37 题(单选题,3 分)
②处应填()。
x[i] = kx[k] = n - ix[k] = ix[i] = x[k]正确答案C
解析详情
将第 k 行的皇后放在 i 位置。
第 38 题(单选题,3 分)
③处应填()。
k > n - 1k >= n - 1k == nk > n正确答案B
解析详情
当 k==n-1 时表示枚举完成,停止搜索并输出方案。
第 39 题(单选题,3 分)
④处应填( )。
NQueens(k, n - 1, x)NQueens(k + 1, n, x)NQueens(k + 1, n - 1, x)cout << x[k] << " "正确答案B
解析详情
继续搜索下一行,n 和 x 都没变化。
第 40 题(单选题,3 分)
⑤处应填( )。
NQueens(1, 8, x)NQueens(0, 7, x + 1)NQueens(0, 8, x)NQueens(1, 8, x + 1)正确答案C
解析详情
根据 j 的循环范围,下标从 0 开始,所以参数 k=0,x 也是从 x[0] 开始。