CSP-S 提高级 初赛 模拟试卷(二)

满分 100 分 | 考试时间 120 分钟 | 题型:单选 15 × 2 + 多选 5 × 2 + 阅读 3 × 约13 + 完善 2 × 约10
说明:本卷为模拟练习(卷二),考点在一卷基础上拓展(哈夫曼、树遍历、图算法、字符串、筛法等)。多项选择题每小题 2 分,全部选对得 2 分,选对但不全得 1 分,有错选得 0 分。打印时自动隐藏解析。

一、单项选择题(共 15 题,每题 2 分,共 30 分)

1.二进制数 101101 对应的十进制整数是(  )。
A. 43
B. 45
C. 46
D. 44
2.在长度为 n 的有序数组中用二分查找某个元素,最坏情况下的比较次数约为(  )。
A. O(1)
B. O(log n)
C. O(n)
D. O(n²)
3.队列(Queue)的访问特性是(  )。
A. 后进先出(LIFO)
B. 先进先出(FIFO)
C. 随机访问
D. 只能访问中间元素
4.一棵满二叉树,若根节点为第 1 层,则第 5 层的节点数是(  )。
A. 15
B. 16
C. 31
D. 32
5.下列关于堆排序的说法,正确的是(  )。
A. 它是一种稳定排序
B. 它是不稳定排序
C. 平均时间复杂度为 O(n²)
D. 需要 O(n) 的额外辅助空间
6.C++ 中表达式 1 + 2 * 3 - 4 / 2 的求值结果是(  )。(整数除法)
A. 4
B. 5
C. 6
D. 3
7.对权值集合 {2, 3, 5, 7} 构造哈夫曼(Huffman)树,其带权路径长度 WPL 为(  )。
A. 30
B. 32
C. 34
D. 36
8.一棵有 15 个节点的二叉树,其最小可能高度(根高度为 1)是(  )。
A. 3
B. 4
C. 5
D. 6
9.八进制数 17 对应的十进制数是(  )。
A. 14
B. 15
C. 16
D. 17
10.求解 n 层汉诺塔问题,最少需要移动圆盘的次数是(  )。
A. 2n
B. 2ⁿ - 1
C. n²
D. n!
11.直接插入排序在最好情况(输入序列已按升序排列)下的时间复杂度为(  )。
A. O(n²)
B. O(n)
C. O(n log n)
D. O(1)
12.根据德·摩根定律,¬(P ∧ Q) 等价于(  )。
A. ¬P ∧ ¬Q
B. ¬P ∨ ¬Q
C. P ∨ Q
D. P ∧ Q
13.已知某二叉树的前序遍历为 ABDECF,中序遍历为 DBEAFC,则其后序遍历为(  )。
A. DEBFCA
B. DBEFCA
C. EDBFCA
D. DEBCFA
14.下列算法中,可用于求解"单源最短路径"问题的是(  )。
A. Dijkstra 算法
B. Kruskal 算法
C. 冒泡排序
D. 快速排序
15.世界上第一台通用电子数字计算机 ENIAC 诞生于(  )。
A. 1942 年
B. 1946 年
C. 1950 年
D. 1956 年

二、多项选择题(共 5 题,每题 2 分,共 10 分)

1.下列数据结构中,属于线性结构的有(  )。
A. 栈
B. 队列
C. 数组
D. 二叉树
2.下列算法中,通常采用"贪心"策略的有(  )。
A. Prim(最小生成树)
B. Kruskal(最小生成树)
C. Dijkstra(单源最短路)
D. 归并排序
3.下列 C++ 标准库组件中,可以归入 STL 容器的有(  )。
A. vector
B. list
C. map
D. stack
4.图的常用存储结构包括(  )。
A. 邻接矩阵
B. 邻接表
C. 十字链表
D. 哈希表
5.下列关于渐进时间复杂度大小关系的描述,正确的是(  )。
A. O(1) < O(log n)
B. O(log n) < O(n)
C. O(n) < O(n log n)
D. O(n log n) < O(n²)

三、程序阅读题(共 3 题,每空/每问按标注分值,共约 40 分)

1.(13 分)阅读程序,回答问题。
#include <iostream>
#include <string>
using namespace std;
int main() {
    string s = "abracadabra";
    int cnt[26] = {0};
    for (char c : s) cnt[c - 'a']++;
    cout << cnt['a' - 'a'] << " " << cnt['b' - 'a'] << endl;
    return 0;
}
(1)程序运行时输出的结果是______。(4 分)
(2)该程序实现的功能是______。(4 分)
(3)若将字符串改为全大写字母(如 "ABC"),程序会出现什么问题?______。(5 分)
2.(13 分)阅读程序,回答问题。
#include <iostream>
using namespace std;
int main() {
    const int N = 30;
    bool p[31] = {false};      // p[i]=true 表示 i 是合数
    for (int i = 2; i * i <= N; i++)
        if (!p[i])
            for (int j = i * i; j <= N; j += i) p[j] = true;
    int c = 0;
    for (int i = 2; i <= N; i++) if (!p[i]) c++;
    cout << c << endl;
    return 0;
}
(1)程序输出结果是______。(4 分)
(2)该程序使用的算法名称是______。(4 分)
(3)该算法的时间复杂度约为______。(5 分)
3.(14 分)阅读程序,回答问题。
#include <iostream>
using namespace std;
int g(int n) {
    if (n == 1) return 1;
    return 2 * g(n - 1) + 1;
}
int main() {
    cout << g(5) << endl;
    return 0;
}
(1)程序输出结果是______。(4 分)
(2)函数 g(n) 的闭式(通项公式)是______。(5 分)
(3)该函数的时间复杂度和空间复杂度分别约为多少?(5 分)

四、程序完善题(共 2 题,共约 20 分)

1.(10 分)以下为直接插入排序(升序)。请完善空缺处。
void insertSort(int a[], int n) {
    for (int i = 1; i < n; i++) {
        int key = ① ;
        int j = ② ;
        while (j >= 0 && a[j] > key) {
            ③ ;   // 元素后移
            ④ ;   // j 前移
        }
        ⑤ ;   // 插入到正确位置
    }
}
① __________ ② __________ ③ __________ ④ __________ ⑤ __________
2.(10 分)以下为对图进行深度优先遍历(DFS)的递归函数,G 为邻接表,vis 为访问标记数组。请完善空缺处。
void dfs(int u) {
    ① ;              // 标记 u 已访问
    cout << u << " ";
    for (int v : G[u]) {
        if (② )      // v 尚未访问
            ③ ;          // 递归访问 v
    }
}
① __________ ② __________ ③ __________

答案速查

题型答案
单选 1-15B B B B B / B B B B B / B B A A B
多选 1-5ABC / ABC / ABCD / ABC / ABCD
阅读1(1)5 2 (2)统计各小写字母出现频次 (3)数组越界(c-'a'为负/超界)
阅读2(1)10 (2)埃拉托斯特尼筛法(素数筛) (3)O(N log log N)
阅读3(1)31 (2)2ⁿ-1 (3)时间O(n)、空间O(n,递归深度)
完善1①a[i] ②i-1 ③a[j+1]=a[j] ④j-- ⑤a[j+1]=key
完善2①vis[u]=true ②!vis[v] ③dfs(v)

答案解析

【单选 1】B。 二进制 101101 = 1×32 + 0×16 + 1×8 + 1×4 + 0×2 + 1×1 = 32+8+4+1 = 45。
【单选 2】B。 二分查找每次将区间减半,最坏需约 log₂n 次比较,复杂度 O(log n)。
【单选 3】B。 队列是先进先出(FIFO),只允许在一端(队尾)入、另一端(队头)出。栈才是 LIFO。
【单选 4】B。 满二叉树第 k 层节点数为 2^(k-1),第 5 层 = 2⁴ = 16。
【单选 5】B。 堆排序是不稳定排序(如 [2a, 2b, 1] 排序后 2b 可能到 2a 前);时间复杂度稳定 O(n log n);原地,额外空间 O(1)。
【单选 6】B。 先算乘除:2*3=6,4/2=2(整数除法),再 1+6-2 = 5。
【单选 7】B。 哈夫曼合并:取最小 2,3→5;再取 5,5→10;再取 10,7→17。总代价(WPL)= 5+10+17 = 32。也可按叶子深度算:2、3 深度 3,5 深度 2,7 深度 1 → 2×3+3×3+5×2+7×1=32。
【单选 8】B。 n 个节点的二叉树最小高度为 ⌊log₂n⌋+1。⌊log₂15⌋=3,故最小高度 4(完全二叉树形态)。
【单选 9】B。 八进制 17 = 1×8 + 7 = 15。
【单选 10】B。 n 层汉诺塔最少移动次数满足 H(n)=2H(n-1)+1,解为 H(n)=2ⁿ-1;H(3)=7。
【单选 11】B。 已升序时,每个元素只需与已排好部分比较一次即停止,总比较约 n-1 次,复杂度 O(n);最坏(逆序)才 O(n²)。
【单选 12】B。 德·摩根定律:¬(P∧Q) ≡ ¬P ∨ ¬Q;¬(P∨Q) ≡ ¬P ∧ ¬Q。
【单选 13】A。 前序首字母 A 为根;中序 A 左为 DBE、右为 FC。左子树前序 BDE、中序 DBE → B 为左根,D 左、E 右;右子树前序 CF、中序 FC → C 为右根,F 左。后序:左 DEB + 右 FC + 根 A = DEBFCA。
【单选 14】A。 Dijkstra 用于单源最短路径(边权非负);Kruskal 用于最小生成树。
【单选 15】B。 ENIAC 于 1946 年在美国宾夕法尼亚大学研制成功。
【多选 1】ABC。 栈、队列、数组都是线性结构(元素间一对一);二叉树是树形(非线性)结构。
【多选 2】ABC。 Prim、Kruskal(最小生成树)与 Dijkstra(最短路)均为典型贪心算法;归并排序属分治。
【多选 3】ABCD。 vector、list、map 是标准容器;stack 是"容器适配器",初赛常将其与容器一并考查,故选全。
【多选 4】ABC。 图的存储:邻接矩阵、邻接表、十字链表(有向图)、邻接多重表等;哈希表是散列结构,不是图的存储。
【多选 5】ABCD。 渐进关系成立:常数 < 对数 < 线性 < 线性对数 < 平方。
【阅读 1】 程序用 cnt[26] 统计各小写字母频率。(1)"abracadabra" 中 a 出现 5 次、b 出现 2 次,输出 5 2。(2)功能是统计字符串中各小写字母的出现次数(词频统计)。(3)若字符串含大写字母,c-'a' 会得到负数或 ≥26 的下标,访问 cnt[负数/越界] 导致数组越界,行为未定义。
【阅读 2】 这是埃拉托斯特尼筛法:用 bool 标记合数,从 i=2 起到 √N,将 i 的倍数标为合数,最后统计未被标记(即素数)的个数。(1)2~30 间素数有 2,3,5,7,11,13,17,19,23,29 共 10 个,输出 10。(2)埃拉托斯特尼筛法(素数筛法)。(3)时间复杂度约 O(N log log N)。
【阅读 3】 g(1)=1,g(2)=2×1+1=3,g(3)=7,g(4)=15,g(5)=31。(1)输出 31。(2)递推 g(n)=2g(n-1)+1 的闭式为 g(n)=2ⁿ-1(正是 n 层汉诺塔移动次数)。(3)时间复杂度 O(n)(递推 n 次);空间复杂度 O(n)(递归调用栈深度 n)。
【完善 1】直接插入排序。 ① 取待插入元素 key = a[i];② 已排好区间末尾 j = i-1;③ 若 a[j]>key 则将 a[j] 后移 a[j+1] = a[j];④ j-- 继续向前比较;⑤ 找到位置后 a[j+1] = key 插入。
【完善 2】图的 DFS。 ① 进入即标记 vis[u] = true;② 对邻接点 v 判断是否未访问 !vis[v];③ 未访问则递归 dfs(v)。

逐题查看:本卷每一题都可单独打开,含正确答案与详细解析 → 模拟试卷(二)全部题目 · 题库全部题目