GESP 客观题评测系统

试卷解析 · 理解每一步

提高组 CSP-S 2026 初赛模拟卷 7

CSPS-2026-R1-Mock-7

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

一、单项选择题

第 1 题(单选题,2 分)

表达式 a∗(b+c)−d/fa*(b+c)-d/f 转后缀表达式的结果是()。

A.
abc∗+df−/abc*+df-/
B.
abc+∗df/−abc+*df/-
C.
bc+a∗df/−bc+a*df/-
D.
abc+x−df/abc+x-df/

正确答案B

解析详情
答案 B计算机基础与数据结构算法
思路与推导
  1. 先算 b+c,bc+;再算 a*(b+c),abc+*;再算 d/f,abc+*df/,最后得 abc+x-df/。

第 2 题(单选题,2 分)

以下字符串中,字典序最小的是()。

A.
NOIP2017
B.
NOIPC
C.
NOIPC++
D.
NOIPP

正确答案A

解析详情
答案 A计算机基础与数据结构算法
思路与推导
  1. 前缀 NOIP 都一样,直接比较 2、C、C、P,根据 ASCII 码值,字符 2(十进制 50)最小。

第 3 题(单选题,2 分)

在 C++ 中,表达式 ('O' - 'I') ^ 13 % 9 + 5 的值是()。

A.
7
B.
8
C.
14
D.
15

正确答案D

解析详情
答案 D计算机基础与数据结构算法
思路与推导
  1. ∧是异或运算符。位运算优先级较低,先算('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.
SA+141
B.
SA+180
C.
SA+222
D.
SA+225

正确答案A

解析详情
答案 A计算机基础与数据结构算法
思路与推导
  1. 对于数组地址计算问题,只要掌握数据是顺序存储的并占用连续的存储空间。本题是按行分配空间,一般数组下标是从 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 协议族中,最核心的网络协议是()。

A.
UDP
B.
HTTP
C.
TCP
D.
IP

正确答案D

解析详情
答案 D计算机基础与数据结构算法
思路与推导
  1. IP 协议是 TCP/IP 协议的核心。

第 6 题(单选题,2 分)

应用快速排序的分治思想可以实现一个求第 K 大数的程序。假定不考虑极端的最坏情况,在平均情况下算法的期望时间复杂度为()。

A.
O(n2)O(n^{2})
B.
O(log⁡n)O(\log n)
C.
O(n)O(n)
D.
O(nlog⁡n)O(n \log n)

正确答案C

解析详情
答案 C计算机基础与数据结构算法
思路与推导
  1. 求第 K 大数,可以在序列中先随机选取一个数,然后将比这个数小的移到这个数的左边,其余的移到右边,然后可以判断出第 K 大的数在哪一侧,递归处理即可。每次期望将数据规模缩减一半,时间复杂度为 T(1)=1,T(n)=T(n/2)+n=O(n)T(1) = 1, T(n) = T(n/2) + n = O(n)。

第 7 题(单选题,2 分)

为解决计算机主机与外设之间速度不匹配的问题,通常会设置一个缓冲池。主机将输出数据依次写入该缓冲池,而外设从该缓冲池中依次取出数据。该缓冲池应该是一个( )结构。

A.
栈
B.
队列
C.
二叉树
D.
链表

正确答案B

解析详情
答案 B计算机基础与数据结构算法
思路与推导
  1. 主机将计算机输出的数据依次写入该缓冲区,而外设从该缓冲区中取出数据。需要先进先出,保持顺序不变,因此是队列的结构。

第 8 题(单选题,2 分)

(1E34) 16_{16} - (676) 8_{8} 的结果是()。

A.
(1110001111110) 2_{2}
B.
(7276) 10_{10}
C.
(1C6C) 16_{16}
D.
(16166) 8_{8}

正确答案D

解析详情
答案 D计算机基础与数据结构算法
思路与推导
  1. 十六进制 1E34 转十进制: 1×163+14×162+3×161+4×160=4096+3584+48+4=77321 \times 16^{3} + 14 \times 16^{2} + 3 \times 16^{1} + 4 \times 16^{0} = 4096 + 3584 + 48 + 4 = 7732,八进制 676 转十进制: 6×82+7×81+6×80=384+56+6=4466 \times 8^{2} + 7 \times 8^{1} + 6 \times 8^{0} = 384 + 56 + 6 = 446,7732 - 446 = 7286。逐个计算各选项转十进制的值,发现一致的是选项 D。 1×84+6×83+1×82+6×81+6=4096+3072+64+48+6=72861 \times 8^{4} + 6 \times 8^{3} + 1 \times 8^{2} + 6 \times 8^{1} + 6 = 4096 + 3072 + 64 + 48 + 6 = 7286。

第 9 题(单选题,2 分)

一棵二叉树的前序遍历序列为 ABDECFGH,后序遍历序列为 EDBGFHCA。下列选项中,( ) 不是可能的中序遍历序列。

A.
DEBAFGCH
B.
EDBAGFCH
C.
DBEAFGCH
D.
BEDAFGCH

正确答案C

解析详情
答案 C计算机基础与数据结构算法
思路与推导
  1. 已知“中序 + 前序”或“中序 + 后序”可以唯一确定二叉树结构,但“前序 + 后序”不行。一种做法是对每个选项与题面的前序,画出二叉树,再验证后序。讨巧的办法是首先确定 A 是根节点,发现四个选项中 A 左右值的集合是一样的,所以左子树包含 B、D、E,右子树包含 C、F、G、H。同理可再确定 A 的左子节点是 B,右子节点是 C。这时候剩下的情况已经不多了,稍微画一下就能确定。

第 10 题(单选题,2 分)

一个栈的输入序列为 12345,下列序列中,( ) 不可能是栈的输出序列。

A.
54321
B.
24135
C.
32541
D.
13542

正确答案B

解析详情
答案 B计算机基础与数据结构算法
思路与推导
  1. 有 “3-1-2” 型子序列的就是不可能的,如 B 选项中的 413。

第 11 题(单选题,2 分)

Linux 是一个用 C 语言写成的开源计算机操作系统内核,有大量的操作系统是基于 Linux 内核创建的。以下操作系统中,( )使用的不是 Linux 内核。

A.
Android
B.
CentOS
C.
Windows
D.
Ubuntu

正确答案C

解析详情
答案 C计算机基础与数据结构算法
思路与推导
  1. Windows 使用的不是 Linux 内核。

第 12 题(单选题,2 分)

下列关于计算机算法的说法中,正确的是()。

A.
对于一个问题,我们能通过优化算法,不断降低算法复杂度
B.
判断一个算法的好坏,主要依据它在某台计算机上具体实现时的运行时间
C.
一个算法必须至少有一个输入
D.
算法复杂度理论中,P=NP 问题(NP 完全问题)仍是一个未解之谜

正确答案D

解析详情
答案 D计算机基础与数据结构算法
思路与推导
  1. A:不断降低算法复杂度显然不可能;B:衡量算法应该在逻辑上,而不是特定机器上,因

  2. 为机器环境也会影响同一算法的运行速度;C:可以没有输入;D:克雷数学研究所公布的七个千禧年数学难题之一,目前没有人解出。

第 13 题(单选题,2 分)

以下关于二叉树性质的描述中,正确的是()。

A.
在任意非空二叉树中,若叶节点的个数为 n0n_{0},度为 2 的节点数为 n2n_{2},则 n0=n2+1n_{0} = n_{2} + 1
B.
深度为 k 的二叉树至多有 2k2^{k} 个节点
C.
没有一棵二叉树的前序遍历序列与后序遍历序列相同
D.
具有 n 个节点的完全二叉树的深度为 ⌊log⁡2(n+1)⌋\lfloor \log_{2}(n+1) \rfloor

正确答案A

解析详情
答案 A计算机基础与数据结构算法
思路与推导
  1. A: 正确,每出现一个度为2的节点,就会减少一个连通分支;B: 至多有 2k−12^k - 1个节点;C: 只有1个孤立点的树就满足;D: 具有 nn个节点的完全二叉树的深度为 ⌊log⁡2n⌋+1\lfloor \log_2 n \rfloor + 1。

第 14 题(单选题,2 分)

排序算法是稳定的,这句话的意思是,排序前后,关键码相同的记录的相对位置不发生改变。以下排序算法不稳定的是()。

A.
插入排序
B.
快速排序
C.
冒泡排序
D.
归并排序

正确答案B

解析详情
答案 B计算机基础与数据结构算法
思路与推导
  1. 常识。快速排序因为每次轴点后直接跳到特定位置,所以不保证不会越过同值的位置。

第 15 题(单选题,2 分)

给定 m 种颜色和有 n 个点的手环,要求用这 m 种颜色给这条手环着色。若两种着色方案可通过旋转或翻转相互得到,则视为同一种着色方案,如对于有 3 个点的手环,ABC 的着色方案与 BCA(旋转)、ACB(翻转)视为同一种方案。当 m=2 且 n=2 时,一共有 3 种着色方案,分别为 AA、AB、BB。那么当 m=5 且 n=4 时,一共有( )种着色方案。

A.
625
B.
160
C.
60
D.
120

正确答案D

解析详情
答案 D计算机基础与数据结构算法
思路与推导
  1. 本题正解是波利亚定理,如果你知道这个知识点,那么所有翻转和旋转组合后,置换群的置换一共有以下几个:(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。根据波利亚定理,答案为: (2×5+3×52+2×53+54)/8=120(2\times5+3\times5^{2}+2\times5^{3}+5^{4})/8=120。

  2. 但波利亚定理是超纲知识点,如果不会,那就只能分组硬算。

  3. 染1种颜色:5种;

  4. 染2种颜色:1112、1212、1122、1222,计 4×C52=404\times C_{5}^{2}=40种;

  5. 染3种颜色:1123、1213、2213、2123、3312、3132,计 6×C53=606\times C_{5}^{3}=60种;

  6. 染4种颜色:圆排列,计 4!/4/2×C54=154!/4/2\times C_{5}^{4}=15种。

二、阅读程序(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() 函数返回之前的最后一行,输出结果不会发生变化。 ( )

正确答案错误

解析详情
答案 错误汉诺塔递归
思路与推导
  1. 如果这样修改,n==1 时 ++tot 不会执行,输出会变小。

第 17 题(判断题,3 分)

输入的 n=2 时,输出的第一行为 A -> B/B -> C/A -> C/。 ( )

正确答案错误

解析详情
答案 错误汉诺塔递归
思路与推导
  1. 直接模拟即可。或注意到题面中的移动方法是非法的,会将大圆环压在小圆环上。

第 18 题(判断题,3 分)

输入的 n=3 时,输出的第二行为 8。 ( )

正确答案错误

解析详情
答案 错误汉诺塔递归
思路与推导
  1. 移动次数 f(1)=1f(1)=1, f(i)=f(i−2)∗2+1f(i)=f(i-2)*2+1,所以 f(3)=7f(3)=7。

第 19 题(判断题,3 分)

本程序的含义可以是:有三根柱子,第一根柱子从上到下依次套有编号为 1∼n1 \sim n 的圆环,现在每次可以移动某根柱子顶部的圆环到另一根柱子的顶部,并要求编号较大的圆环始终不能在编号较小的上面,输出一种操作次数最少的方案以及对应的操作次数。 ()

正确答案正确

解析详情
答案 正确汉诺塔递归
思路与推导
  1. 经典的汉诺塔问题,函数命名就是提示。

二、阅读程序(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));,不影响程序运行结果。 ()

正确答案正确

解析详情
答案 正确螺旋矩阵模拟
思路与推导
  1. a 数组在全局定义,所以默认都为零。

第 21 题(判断题,2 分)

将 while (count < n*n) 改为 while (count <= n*n),不影响程序运行结果。 ( )

正确答案错误

解析详情
答案 错误螺旋矩阵模拟
思路与推导
  1. 因为 a[0][n-1] 已经填上 1,count 表示已经填入了几个数,count == n*n 时已经填满,继续执行会进入死循环。

第 22 题(判断题,2 分)

输入的 n=4 时,程序输出的 a[3][2] 的值为 15。 ()

正确答案错误

解析详情
答案 错误螺旋矩阵模拟
思路与推导
  1. 输出结果如下,a[3][2]=5(代码中下标范围是 0~n-1)。

  2. 10 11 12 1

  3. 9 16 13 2

  4. 8 15 14 3

  5. 7 6 5 4

第 23 题(单选题,4 分)

本程序的时间复杂度为()。

A.
O(n)O(n)
B.
O(n2)O(n^{2})
C.
O(n3)O(n^{3})
D.
O(n2log⁡n)O(n^{2} \log n)

正确答案B

解析详情
答案 B螺旋矩阵模拟
思路与推导
  1. count 每轮至少增加一,所以不会高于 O(n2)O(n^{2}),从题意逻辑也容易得到结果。

第 24 题(单选题,4 分)

(4分)输入的 n=100 时,a[33][66] 的值为()。

A.
8779
B.
8707
C.
10957
D.
8845

正确答案D

解析详情
答案 D螺旋矩阵模拟
思路与推导
  1. 选项 C 可直接排除,其他三个选项只能靠计算了。第 i 圈一共有 4×(n−2i+1)4 \times (n - 2i + 1) 个数。而 a[33][66] 是第 34 圈的第一个数, 1∼331 \sim 33 圈共有 (33×(2n−66)/2)×4(33 \times (2n - 66)/2) \times 4 = 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;,不影响程序运行结果。 ()

正确答案错误

解析详情
答案 错误字符串移位与循环置换
思路与推导
  1. st 要赋回最后一个非字母的值,否则就不是循环位移。用一个例子模拟也可以说明,例如输入 s="ab" 即可。

第 26 题(判断题,2 分)

如果输入的 s 不含大写字母,则输出结果与 k 的值无关。 ()

正确答案正确

解析详情
答案 正确字符串移位与循环置换
思路与推导
  1. 第一个 for 循环里两个 if 都不会命中。其实 char pre;这句前后部分的逻辑是独立的(输出 s 除外)。

第 27 题(判断题,2 分)

如果知道输出结果,能够反推出唯一的输入。 ()

正确答案错误

解析详情
答案 错误字符串移位与循环置换
思路与推导
  1. 还需要知道 k。

第 28 题(判断题,2 分)

当 k 的值确定时,不存在两个不同的输入使得输出相同。 ()

正确答案正确

解析详情
答案 正确字符串移位与循环置换
思路与推导
  1. 当 k 确定时,一个输出到输出是双射,不管值还是下标上的循环位移都是可逆的。

第 29 题(单选题,3 分)

如果输入是 6 KU96APY5,则输出为()。

A.
QB96GWE5
B.
QA59GVE6
C.
PA59GWF6
D.
PB96GWE5

正确答案B

解析详情
答案 B字符串移位与循环置换
思路与推导
  1. 模拟即可。这里盯第一位和最后一位最方便。第一位 K+6=QK + 6 = Q,最后一位显然不再是 5,这样就能确定是选项 B 了。

第 30 题(单选题,3 分)

如果输出是 ab1287F2Tguz,则输入可能为()。

A.
0 ab1287F2Tguz
B.
3 b1287BgTuza
C.
16 b12872PgDuza
D.
13 b12872MgAuza

正确答案C

解析详情
答案 C字符串移位与循环置换
思路与推导
  1. 可逐个代入验证。讨巧方法:选项 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 分)

①处应填()。

A.
in[i] == 0
B.
in[i] == 1
C.
a[i][u] == 0
D.
a[i][u] == 1

正确答案A

解析详情
答案 A拓扑排序
思路与推导
  1. 拓扑排序开始应当将入度为0的节点加入队列中。

第 32 题(单选题,3 分)

②处应填()。

A.
q.front()
B.
cur
C.
q.back()
D.
s[cur]

正确答案B

解析详情
答案 B拓扑排序
思路与推导
  1. 将当前队首的节点插入到当前拓扑序的末尾。

第 33 题(单选题,3 分)

③处应填( )。

A.
!--in[i]
B.
a[u][v] == 1
C.
a[cur][i] == 1
D.
!in[i]

正确答案C

解析详情
答案 C拓扑排序
思路与推导
  1. 判断 cur 和 i 之间有没有连边,a 是邻接矩阵。

第 34 题(单选题,3 分)

④处应填()。

A.
in[i]++
B.
in[i]--
C.
q.pop()
D.
q.push(cur)

正确答案B

解析详情
答案 B拓扑排序
思路与推导
  1. 删掉 cur → i,i 的入度减一。

第 35 题(单选题,3 分)

⑤处应填()。

A.
in[u]++
B.
in[u]--
C.
a[u][v] = 1
D.
a[v][u] = 1

正确答案C

解析详情
答案 C拓扑排序
思路与推导
  1. 有向边在邻接矩阵中标记为 1,代表有路相连。

三、完善程序(2)

(八皇后问题)要求用回溯法求解八皇后问题:在 8×88 \times 8 的棋盘上放置八个皇后,确保任意两个皇后都不在同一行、同一列或同一斜线上。请输出八皇后问题的所有可行解。

#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 分)

① 处应填()。

A.
x[j] == i - 1
B.
abs(x[j] - i) <= 1
C.
abs(x[j] - k) == i - j
D.
abs(x[j] - i) == k - j

正确答案D

解析详情
答案 D八皇后回溯
思路与推导
  1. 判断 (j,x[j])(j,x[j]) 和 (k,i)(k,i) 是否在一条斜线上。

第 37 题(单选题,3 分)

②处应填()。

A.
x[i] = k
B.
x[k] = n - i
C.
x[k] = i
D.
x[i] = x[k]

正确答案C

解析详情
答案 C八皇后回溯
思路与推导
  1. 将第 k 行的皇后放在 i 位置。

第 38 题(单选题,3 分)

③处应填()。

A.
k > n - 1
B.
k >= n - 1
C.
k == n
D.
k > n

正确答案B

解析详情
答案 B八皇后回溯
思路与推导
  1. 当 k==n-1 时表示枚举完成,停止搜索并输出方案。

第 39 题(单选题,3 分)

④处应填( )。

A.
NQueens(k, n - 1, x)
B.
NQueens(k + 1, n, x)
C.
NQueens(k + 1, n - 1, x)
D.
cout << x[k] << " "

正确答案B

解析详情
答案 B八皇后回溯
思路与推导
  1. 继续搜索下一行,n 和 x 都没变化。

第 40 题(单选题,3 分)

⑤处应填( )。

A.
NQueens(1, 8, x)
B.
NQueens(0, 7, x + 1)
C.
NQueens(0, 8, x)
D.
NQueens(1, 8, x + 1)

正确答案C

解析详情
答案 C八皇后回溯
思路与推导
  1. 根据 j 的循环范围,下标从 0 开始,所以参数 k=0,x 也是从 x[0] 开始。