CSP-J模拟卷1

    客观题

CSP-J模拟卷1

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

CSP-J 第一轮认证 模拟试题

满分 100 分,考试时间 120 分钟。

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

1. 计算机中,1 KB 存储容量等于( )字节。
{{ select(1) }}

  • 1000
  • 1024
  • 512
  • 2048

2. 二进制数 101101 对应的十进制数是( )。
{{ select(2) }}

  • 44
  • 45
  • 46
  • 47

3. 十六进制数 2F 对应的十进制数是( )。
{{ select(3) }}

  • 31
  • 47
  • 57
  • 61

4. 在 C++ 中,下列运算符中优先级最高的是( )。
{{ select(4) }}

  • &&
  • ||
  • !
  • ==

5. 若 x = 6y = 4,依次执行 x += y; 与 x *= 2; 后,x 的值为( )。
{{ select(5) }}

  • 16
  • 18
  • 20
  • 22

6. 关于栈和队列,下列说法正确的是( )。
{{ select(6) }}

  • 栈是先进先出的线性结构
  • 队列是后进先出的线性结构
  • 栈和队列都是线性结构,区别在于插入与删除元素的位置受限不同
  • 队列只能用链表实现,不能用数组实现

7. 由 4 个结点可以构成多少棵不同的二叉树形态(不考虑结点标号)?( )
{{ select(7) }}

  • 8
  • 12
  • 14
  • 16

8. 下列排序算法中,最坏情况下时间复杂度为 O(n²) 的是( )。
{{ select(8) }}

  • 堆排序
  • 归并排序
  • 快速排序
  • 基数排序

9. 不采用记忆化、直接递归求解斐波那契数列 F(n) = F(n-1) + F(n-2),其时间复杂度约为( )。
{{ select(9) }}

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

10. 下列关于 DNS 的说法正确的是( )。
{{ select(10) }}

  • DNS 用于将域名解析为对应的 IP 地址
  • DNS 用于对网络数据进行加密传输
  • DNS 用于在浏览器与服务器之间传输网页文件
  • DNS 用于路由器之间的寻址

11. 一棵完全二叉树共有 2024 个结点,其叶子结点的个数为( )。
{{ select(11) }}

  • 1010
  • 1011
  • 1012
  • 1013

12. 将 7 个不同的球放入 3 个不同的盒子,要求每个盒子至少有一个球,共有( )种放法。
{{ select(12) }}

  • 1806
  • 2100
  • 2187
  • 1785

13. 一棵二叉树的前序遍历为 ABC,中序遍历为 BCA,则它的后序遍历为( )。
{{ select(13) }}

  • BCA
  • CBA
  • CAB
  • ACB

14. 关于无向图的邻接表存储,下列说法错误的是( )。
{{ select(14) }}

  • 邻接表适合存储边数较少的稀疏图
  • 邻接表存储空间与边数成正比
  • 利用邻接表判断两个顶点是否相邻的时间复杂度为 O(1)
  • 利用邻接表可以方便地找出某个顶点的所有邻接点

15. 关于 C++ 中的整型溢出,下列说法正确的是( )。
{{ select(15) }}

  • int 型溢出后会自动转为 long long
  • int 型溢出属于未定义行为,实际编译中常见表现为数值回绕
  • unsigned int 溢出后的行为未定义
  • 使用 long long 就一定不会溢出

二、阅读程序(共 3 段,共 40 分)

阅读程序(一)

  1 #include <iostream>
  2 using namespace std;
  3 int main() {
  4     int n, ans = 0;
  5     cin >> n;
  6     for (int i = 2; i * i <= n; i++) {
  7         while (n % i == 0) {
  8             n /= i;
  9             ans++;
 10         }
 11     }
 12     if (n > 1) ans++;
 13     cout << ans << endl;
 14     return 0;
 15 }

16. 当输入 n 为质数时,程序输出的值为 1。( )
{{ select(16) }}

  • 正确
  • 错误

17. 输入 n = 2 时,程序输出的值是 2。( )
{{ select(17) }}

  • 正确
  • 错误

18. 若输入 n = 9,程序输出的值是 2。( )
{{ select(18) }}

  • 正确
  • 错误

19. 输入 n = 2024,程序输出( )。
{{ select(19) }}

  • 4
  • 5
  • 6
  • 7

20. 该程序的时间复杂度约为( )。
{{ select(20) }}

  • O(√n)
  • O(n)
  • O(log n)
  • O(n log n)

阅读程序(二)

  1 #include <iostream>
  2 #include <string>
  3 using namespace std;
  4 int main() {
  5     string s;
  6     cin >> s;
  7     int n = s.length();
  8     int ans = 0;
  9     for (int i = 0; i < n; i++) {
 10         for (int j = i; j < n; j++) {
 11             bool flag = true;
 12             for (int k = i, t = j; k < t; k++, t--) {
 13                 if (s[k] != s[t]) {
 14                     flag = false;
 15                     break;
 16                 }
 17             }
 18             if (flag) ans++;
 19         }
 20     }
 21     cout << ans << endl;
 22     return 0;
 23 }

21. 输入 s = “ab”,程序输出 3。( )
{{ select(21) }}

  • 正确
  • 错误

22. 程序统计的是字符串中回文子串的个数。( )
{{ select(22) }}

  • 正确
  • 错误

23. 输入 s = “a”,程序输出 0。( )
{{ select(23) }}

  • 正确
  • 错误

24. 输入 s = “aba”,程序输出( )。
{{ select(24) }}

  • 3
  • 4
  • 5
  • 6

25. 该程序的时间复杂度为( )。
{{ select(25) }}

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

阅读程序(三)

  1 #include <iostream>
  2 using namespace std;
  3 const int MAXN = 1005;
  4 int a[MAXN], b[MAXN];
  5 int main() {
  6     int n;
  7     cin >> n;
  8     for (int i = 1; i <= n; i++) cin >> a[i];
  9     int len = 0;
 10     for (int i = 1; i <= n; i++) {
 11         if (a[i] > b[len]) {
 12             b[++len] = a[i];
 13         } else {
 14             int l = 1, r = len, pos = 0;
 15             while (l <= r) {
 16                 int mid = (l + r) / 2;
 17                 if (b[mid] >= a[i]) {
 18                     pos = mid;
 19                     r = mid - 1;
 20                 } else {
 21                     l = mid + 1;
 22                 }
 23             }
 24             b[pos] = a[i];
 25         }
 26     }
 27     cout << len << endl;
 28     return 0;
 29 }

26. 输入序列 2 1,程序输出 2。( )
{{ select(26) }}

  • 正确
  • 错误

27. 数组 b 中保存的是各长度上升子序列的最小末尾元素。( )
{{ select(27) }}

  • 正确
  • 错误

28. 若输入的序列严格递增,程序输出 n。( )
{{ select(28) }}

  • 正确
  • 错误

29. 输入 1 3 5 2 4 6,程序输出( )。
{{ select(29) }}

  • 3
  • 4
  • 5
  • 6

30. 若将条件 a[i] > b[len] 改为 a[i] >= b[len](二分条件不变),程序将变为求( )。
{{ select(30) }}

  • 最长上升子序列
  • 最长不下降子序列
  • 最长下降子序列
  • 程序功能不变

31. 输入序列 5 4 3 2 1,程序输出( )。
{{ select(31) }}

  • 1
  • 2
  • 3
  • 5

三、完善程序(共 2 段,共 30 分)

完善程序(一)· 归并排序

【题面】给定 n 个整数,请将它们按从小到大(升序)排序后输出。 【输入格式】第一行一个整数 n;第二行 n 个整数,两数之间用空格隔开。 【输出格式】一行,排序后的 n 个整数,用空格隔开。 【程序功能】采用归并排序:将区间不断二分,再将两个有序区间合并,最终得到整体有序的数组。

  1 #include <iostream>
  2 using namespace std;
  3 const int MAXN = 100005;
  4 int a[MAXN], tmp[MAXN];
  5 
  6 void merge_sort(int l, int r) {
  7     if (l >= r) return;
  8     int mid = (l + r) / 2;
  9     merge_sort(____①____, mid);
 10     merge_sort(____②____, r);
 11     int i = l, j = mid + 1, k = l;
 12     while (i <= mid && j <= r) {
 13         if (a[i] ____③____ a[j])
 14             tmp[k++] = ____④____;
 15         else
 16             tmp[k++] = a[j++];
 17     }
 18     while (i <= mid) tmp[k++] = a[i++];
 19     while (j <= r) tmp[k++] = a[j++];
 20     for (int i = l; i <= r; i++)
 21         ____⑤____;
 22 }
 23 
 24 int main() {
 25     int n;
 26     cin >> n;
 27     for (int i = 1; i <= n; i++) cin >> a[i];
 28     merge_sort(1, n);
 29     for (int i = 1; i <= n; i++) cout << a[i] << " ";
 30     return 0;
 31 }

32. ① 处应填( )。
{{ select(32) }}

  • merge_sort(1, mid)
  • merge_sort(l, mid)
  • merge_sort(l, r)
  • merge_sort(mid, r)

33. ② 处应填( )。
{{ select(33) }}

  • merge_sort(l, r)
  • merge_sort(mid, r)
  • merge_sort(mid + 1, r)
  • merge_sort(l, mid)

34. ③ 处应填( )。
{{ select(34) }}

  • <
  • >
  • <=
  • >=

35. ④ 处应填( )。
{{ select(35) }}

  • a[i++]
  • a[j++]
  • tmp[i++]
  • a[++i]

36. ⑤ 处应填( )。
{{ select(36) }}

  • a[i] = tmp[i]
  • tmp[i] = a[i]
  • a[l] = tmp[i]
  • a[i] = tmp[l]

完善程序(二)· 传球游戏(NOIP 2008 普及组改编)

【题面】n 名同学围成一圈,每人可以把球传给自己左边或右边的同学。现在从 1 号同学手中开始传球,经过恰好 m 次传球后,求球再次回到 1 号同学手中的不同传球方案数。 【输入格式】一行,两个整数 n、m(2 ≤ n ≤ 30,1 ≤ m ≤ 30)。 【输出格式】一个整数,表示 m 次传球后球回到 1 号手中的方案数。 【程序功能】采用动态规划:f[i][j] 表示传了 i 次后球在 j 号同学手中的方案数,当前状态等于上一轮左右两名同学的方案数之和。

  1 #include <iostream>
  2 using namespace std;
  3 const int MAXN = 35;
  4 int f[MAXN][MAXN];
  5 
  6 int main() {
  7     int n, m;
  8     cin >> n >> m;
  9     f[0][____①____] = 1;
 10     for (int i = 1; i <= ____②____; i++) {
 11         for (int j = 1; j <= ____③____; j++) {
 12             int left = (j == 1) ? ____④____ : j - 1;
 13             int right = (j == n) ? 1 : j + 1;
 14             f[i][j] = f[i - 1][left] + ____⑤____;
 15         }
 16     }
 17     cout << f[m][1] << endl;
 18     return 0;
 19 }

37. ① 处应填( )。
{{ select(37) }}

  • 1
  • 0
  • n
  • m

38. ② 处应填( )。
{{ select(38) }}

  • m
  • n
  • m - 1
  • n - 1

39. ③ 处应填( )。
{{ select(39) }}

  • m
  • n
  • m + 1
  • n + 1

40. ④ 处应填( )。
{{ select(40) }}

  • j - 1
  • n
  • 1
  • j + 1

41. ⑤ 处应填( )。
{{ select(41) }}

  • f[i - 1][right]
  • f[i][right]
  • f[i - 1][left]
  • f[i][left]

CSP-J普及组第一轮模拟卷

未参加
状态
已结束
规则
OI
题目
1
开始于
2026-9-5 19:00
结束于
2026-9-5 20:30
持续时间
1.5 小时
主持人
参赛人数
18