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 = 6,y = 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) }}
10nm
38. ② 处应填( )。
{{ select(38) }}
mnm - 1n - 1
39. ③ 处应填( )。
{{ select(39) }}
mnm + 1n + 1
40. ④ 处应填( )。
{{ select(40) }}
j - 1n1j + 1
41. ⑤ 处应填( )。
{{ select(41) }}
f[i - 1][right]f[i][right]f[i - 1][left]f[i][left]