#KGT0008. CSP-S 第一轮初赛模拟试卷 · 第 1 套

0

CSP-S 第一轮初赛模拟试卷 · 第 1 套

CSP-S 第一轮(初赛)模拟试卷 · 第 1 套

适用对象: 高一学生(赛前训练) 满分: 100 分  考试时间: 100 分钟  语言: C++

试卷结构:

板块 题型 题量 分值
一、单项选择题 单选 15 题 每题 2 分,共 30 分
二、阅读程序 判断 + 选择 3 题(每题 3 判断 + 3 选择) 共 40 分
三、完善程序 单选(填空) 2 题(每题 5 空) 每题 15 分,共 30 分

说明:阅读程序部分,判断题每题 2 分;选择题每题 2 分,其中标注「3 分」的选择题每题 3 分(共 4 题),合计 40 分。


一、单项选择题(共 15 题,每题 2 分,共 30 分。每题有且仅有一个正确选项。)

1.a = (0x2F)₁₆b = (0x3C)₁₆,则 a ^ b(按位异或)的十进制值为( )。

{{ select(1) }}

  • 19
  • 25
  • 27
  • 15

2. 在 8 位补码表示中,整数 -57 的机器数为( )。

{{ select(2) }}

  • 11000111
  • 10111001
  • 11000110
  • 00111001

3. 已知字符 '0' 的 ASCII 码为 48,'A' 的 ASCII 码为 65。C++ 表达式 (char)('D' - 'A' + '0') 的值为( )。

{{ select(3) }}

  • '3'
  • '4'
  • 'D'
  • 'C'

4. 某 U 盘标称容量 32 GB(按 1 GB = 2^30 B 计算),现要存储大小均为 4 MB(按 1 MB = 2^20 B 计算)的照片,最多可存储( )张。

{{ select(4) }}

  • 8000
  • 8192
  • 8388
  • 10240

5. 下列程序段的时间复杂度为( )。

int s = 0;
for (int i = 1; i <= n; i *= 2)
    for (int j = 1; j <= i; ++j)
        ++s;

{{ select(5) }}

  • O(log n)
  • O(n)
  • O(n log n)
  • O(n²)

6. 元素 1、2、3、4 依次入栈(允许边入边出),下列出栈序列中不合法的是( )。

{{ select(6) }}

  • 1 2 3 4
  • 4 3 2 1
  • 2 4 3 1
  • 3 1 2 4

7. 循环队列用数组 Q[0..5] 存储,队头指针 front 指向队头元素,队尾指针 rear 指向队尾元素的下一个位置。若 front = 2,rear = 5,则当前队列中元素个数为( )。

{{ select(7) }}

  • 2
  • 3
  • 4
  • 5

8. 在不带头结点的单链表中,指针 p 指向某结点(非尾结点),现要将新结点 q 插入到 p 之后,正确的操作序列是( )。

{{ select(8) }}

  • q->next = p->next; p->next = q;
  • p->next = q; q->next = p->next;
  • q->next = p; p->next = q;
  • p->next = q; q->next = p;

9. 一棵完全二叉树有 2023 个结点,其叶子结点数为( )。

{{ select(9) }}

  • 1011
  • 1012
  • 1013
  • 1000

10. 无向图 G 有 7 个顶点,若每个顶点的度数均为 4,则 G 的边数为( )。

{{ select(10) }}

  • 14
  • 28
  • 7
  • 12

11. 下列排序算法中,属于稳定排序的是( )。

{{ select(11) }}

  • 快速排序
  • 堆排序
  • 归并排序
  • 选择排序

12. 在含 1000 个元素的有序数组中用二分查找某个元素,最坏情况下需要比较的次数为( )。

{{ select(12) }}

  • 9
  • 10
  • 11
  • 1000

13. 用递归求解 n 阶汉诺塔问题,设最少移动次数为 T(n),满足 T(1) = 1,T(n) = 2T(n-1) + 1,则 T(5) 的值为( )。

{{ select(13) }}

  • 15
  • 31
  • 63
  • 32

14. gcd(2024, 748) 的值为( )。

{{ select(14) }}

  • 4
  • 22
  • 44
  • 88

15. 下列关于计算机系统的叙述,正确的是( )。

{{ select(15) }}

  • C++ 是编译型语言,程序在运行前一次性翻译为机器码,运行效率较高
  • Python 是编译型语言,程序在运行前一次性翻译为机器码
  • ROM 是易失性存储器,断电后其中数据会丢失
  • 1 个字节(Byte)由 4 个比特(bit)组成

二、阅读程序(共 3 题,40 分。判断题正确填「√」,错误填「×」;选择题每题有且仅有一个正确选项。)

阅读程序(一)

#include <iostream>
#include <string>
using namespace std;
int main() {
    int n, b;
    cin >> n >> b;
    string s = "";
    while (n > 0) {
        int r = n % b;
        if (r < 10) s = char('0' + r) + s;
        else s = char('A' + r - 10) + s;
        n /= b;
    }
    if (s == "") s = "0";
    cout << s << endl;
    return 0;
}

判断题(每题 2 分)

16. 输入 10 2,输出为 1010。( )

{{ select(16) }}

  • 正确
  • 错误

17. 输入 0 8,输出为 0。( )

{{ select(17) }}

  • 正确
  • 错误

18. 输入 255 16,输出为 0xFF。( )

{{ select(18) }}

  • 正确
  • 错误

选择题(每题 2 分)

19. 输入 100 2,输出为( )。

{{ select(19) }}

  • 1100100
  • 110010
  • 1000000
  • 1010100

20. 输入 31 16,输出为( )。

{{ select(20) }}

  • 1F
  • F1
  • 31
  • 1E

21. (3 分)输入 64 8,输出为( )。

{{ select(21) }}

  • 100
  • 80
  • 64
  • 8

阅读程序(二)

#include <iostream>
using namespace std;
int f(int n) {
    if (n == 0) return 1;
    if (n == 1) return 1;
    return f(n - 1) + 2 * f(n - 2);
}
int main() {
    int n;
    cin >> n;
    cout << f(n) << endl;
    return 0;
}

判断题(每题 2 分)

22. 输入 5,输出为 21。( )

{{ select(22) }}

  • 正确
  • 错误

23. 输入 3,输出为 7。( )

{{ select(23) }}

  • 正确
  • 错误

24. f(6) 的值为 43。( )

{{ select(24) }}

  • 正确
  • 错误

选择题(每题 2 分)

25. 输入 7,输出为( )。

{{ select(25) }}

  • 85
  • 127
  • 43
  • 171

26. 输入 10,输出为( )。

{{ select(26) }}

  • 341
  • 683
  • 1023
  • 511

27. (3 分)该函数的时间复杂度为( )。

{{ select(27) }}

  • O(n)
  • O(n²)
  • O(2ⁿ)
  • O(log n)

阅读程序(三)

#include <iostream>
#include <cstring>
using namespace std;
int n, m;
int g[105][105];
bool vis[105];
void dfs(int u) {
    vis[u] = true;
    for (int v = 1; v <= n; v++)
        if (g[u][v] && !vis[v]) dfs(v);
}
int main() {
    memset(g, 0, sizeof(g));
    memset(vis, 0, sizeof(vis));
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int u, v; cin >> u >> v;
        g[u][v] = g[v][u] = 1;
    }
    int cnt = 0;
    for (int i = 1; i <= n; i++)
        if (!vis[i]) { dfs(i); cnt++; }
    cout << cnt << endl;
    return 0;
}

判断题(每题 2 分)

28. 该程序统计的是无向图的连通分量个数。( )

{{ select(28) }}

  • 正确
  • 错误

29. 输入 4 3 及边 1 22 33 4,输出为 1。( )

{{ select(29) }}

  • 正确
  • 错误

30. 输入 4 2 及边 1 23 4,输出为 3。( )

{{ select(30) }}

  • 正确
  • 错误

选择题(每题 2 分)

31. 输入 5 0(无任何边),输出为( )。

{{ select(31) }}

  • 0
  • 1
  • 5
  • 4

32. (3 分)输入 6 5 及边 1 22 34 55 64 6,输出为( )。

{{ select(32) }}

  • 2
  • 3
  • 4
  • 1

33. (3 分)该程序用邻接矩阵存储图,对 n 个顶点执行一次深度优先搜索(覆盖所有连通块)的时间复杂度为( )。

{{ select(33) }}

  • O(n + m)
  • O(n²)
  • O(m²)
  • O(n·m)

三、完善程序(共 2 题,每题 15 分,共 30 分。每题有 5 处空缺,每处空缺对应一道单选。)

完善程序(一) 快速幂

给定正整数 a、b 和 m,计算 a^b mod m 的值。为避免结果过大并降低时间复杂度,采用「快速幂」算法:将指数 b 按二进制拆分,利用 a^(2^k) 可平方递推的性质,在 O(log b) 时间内完成。程序如下,其中 ① ~ ⑤ 为待填代码。

#include <iostream>
using namespace std;
long long power(long long a, long long b, long long m) {
    long long ans = ①;
    a %= ②;
    while (b > 0) {
        if (b % 2 == 1)
            ③;
        a = a * a % m;
        ④;
    }
    return ⑤;
}
int main() {
    long long a, b, m;
    cin >> a >> b >> m;
    cout << power(a, b, m) << endl;
    return 0;
}

34. ① 处应填( )

{{ select(34) }}

  • 0
  • 1
  • a
  • m

35. ② 处应填( )

{{ select(35) }}

  • b
  • m
  • a
  • 1

36. ③ 处应填( )

{{ select(36) }}

  • ans = ans * a % m
  • ans = ans * b % m
  • a = a * a % m
  • b = b - 1

37. ④ 处应填( )

{{ select(37) }}

  • b = b + 1
  • b = b - 1
  • b /= 2
  • b *= 2

38. ⑤ 处应填( )

{{ select(38) }}

  • a
  • b
  • ans
  • 0

完善程序(二) 并查集

给定一个包含 n 个结点(编号 1 ~ n)的无向图,以及 m 条边。用并查集维护结点的连通关系,并统计图中连通块的个数。程序采用「按大小合并」与「路径压缩」两种优化。程序如下,其中 ① ~ ⑤ 为待填代码。

#include <iostream>
using namespace std;
int fa[100005], sz[100005];
int find(int x) {
    if (fa[x] == x) return x;
    return fa[x] = ①;
}
void merge(int x, int y) {
    int fx = find(x), fy = find(y);
    if (fx == fy) ②;
    if (sz[fx] < sz[fy]) ③;
    fa[fy] = fx;
    sz[fx] += ④;
}
int main() {
    int n, m, ans = 0;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) { fa[i] = i; sz[i] = 1; }
    for (int i = 0; i < m; i++) {
        int x, y; cin >> x >> y;
        merge(x, y);
    }
    for (int i = 1; i <= n; i++) if (find(i) == i) ⑤;
    cout << ans << endl;
    return 0;
}

39. ① 处应填( )

{{ select(39) }}

  • fa[x]
  • find(fa[x])
  • fa[fa[x]]
  • x

40. ② 处应填( )

{{ select(40) }}

  • return
  • break
  • continue
  • fa[fx] = fy

41. ③ 处应填( )

{{ select(41) }}

  • swap(fx, fy)
  • swap(x, y)
  • fx = fy
  • return

42. ④ 处应填( )

{{ select(42) }}

  • 1
  • sz[fy]
  • sz[fx]
  • sz[fy] + 1

43. ⑤ 处应填( )

{{ select(43) }}

  • ans = ans + 1
  • ans = 1
  • merge(i, i)
  • continue

—— 试卷结束 ——