#C1216. 2024CSPJ初赛模拟题(七)
2024CSPJ初赛模拟题(七)
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
1.现有一张分辨率为 2048 * 512 像素的 16 位真彩色图像。请问要存储这张图像, 需要多大 的存储空间?( )。 {{ select(1) }}
- 2MB
- 4MB
- 6MB
- 8MB
2.已知 A=B=true,C=false,以下逻辑表达式恒为假的是( )。 {{ select(2) }}
- (A∨┐B)∧B∧┐C
- A∨B∧┐C∨(A∨┐B)
- A∧C∨B∧C
- A∨(┐B∧C)
3.二进制数 110.01 对应的十进制数是( )。 {{ select(3) }}
- 6.75
- 6.5
- 6.25
- 5.25
4.二进制转格雷码规则:将二进制右移一位后与原二进制异或,则二进制数 110011 对应的格雷码()。 {{ select(4) }}
- 101000
- 101010
- 010101
- 110101
5.以下哪个排序算法的平均时间复杂度不是 O(n^2)( )。 {{ select(5) }}
- 选择排序
- 冒泡排序
- 插入排序
- 归并排序
6.前缀表达式 -*ab*c+de 的中缀表达式为( ),其中+、-、*为运算符。 {{ select(6) }}
- a*b-c*(d+e)
- a*b-(d+e)*c
- (d+e)*a-a*b
- c*(d+e)-a*b
7.对于入栈顺序为 1,2,3,4,5 的序列,下列( )不是合法的出栈序列。 {{ select(7) }}
- 1,2,3,4,5
- 2,3,4,1,5
- 5,3,4,2,1
- 1,2,5,4,3
8.下列有关于栈与队列的说法错误的是( )。 {{ select(8) }}
- 队列具有先进先出的特点,也被称为 FIFO 表
- 栈和队列都是线性表,所以只能采用顺序存储
- 入栈序列和出栈序列可能不同
- 当队列发生假溢出时,可以使用循环队列
9.已知二叉树的中根遍历为 BDAGECF,后根遍历为 DBGEFCA,则该二叉树的叶子结点有多少 个( )。 {{ select(9) }}
- 2
- 3
- 4
- 5
10.包含数字 1 的三位自然数有( )个。 {{ select(10) }}
- 268
- 260
- 252
- 244
11.有如下递归函数,调用 solve(10,3)的返回值为( )。
int solve(int n,int m)
if (n == 1) return 1;
else return (f(n - 1, m) + m - 1) % n + 1;
{{ select(11) }}
- 4
- 5
- 6
- 7
12.从 10 个人中选 4 个人参加歌唱比赛,其中甲乙至少有一人被选上有( )种情况。 {{ select(12) }}
- 285
- 140
- 210
- 196
13.高度为 h 的均衡的二叉树是指:如果去掉叶结点及相应树枝,它应该是高度为 h-1 的满 二叉树,已知树根的深度为 1,如果某均衡的二叉树有 1050 个结点,则该树的高度为( )。 {{ select(13) }}
- 9
- 10
- 11
- 12
14.具有 4 个顶点的无向完全图,其生成树有( )个。 {{ select(14) }}
- 10
- 12
- 14
- 16
15.由 0,1,2,3,4 组成没有重复数字的三位数,其中百位数字小于个位数字的共有( )个。 {{ select(15) }}
- 60
- 48
- 30
- 18
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √ , 错误填×; 除 特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
01 #include <iostream>
02 using namespace std;
03 int n;
04 int a[1000];
05 int z(int x)
06 {
07 int ret = 0;
08 for (; x; x >>= 1) ret++;
09 return ret;
10 }
11 int y(int x)
12 {
13 return x|(x-1);
14 }
15 int main()
16 {
17 cin >> n;
18 for (int i = 0; i < n; ++i) cin >> a[i];
19 for (int i = 0; i < n; ++i)
20 cout << y(a[i]) - z(a[i]) << ' ';
21 cout << endl;
22 return 0;
23 }
- 输出的结果不可能为负数( )。 {{ select(16) }}
- 正确
- 错误
- 输入的a[i]必须全为非负整数,否则程序将陷入死循环( )。 {{ select(17) }}
- 正确
- 错误
- 当输入为 1 512002 时,输出为 512000( )。 {{ select(18) }}
- 正确
- 错误
- 将第 13 行的(x-1)改为(x+1),输入的 a[i]全为偶数时,结果不变()。 {{ select(19) }}
- 正确
- 错误
- 当输入 2 65536 2147483647 时,输出为()。 {{ select(20) }}
- 65520 32
- 65520 -32
- 131054 2147483616
- 131054 -2147483616
01 #include <iostream>
02 #include <queue>
03 #include <vector>
04 using namespace std;
05
06 int n, e, d[10005];
07 vector<int> vec[10005];
08 int k = 1, ans[10005];
09
10 void topological()
11 {
12 queue<int> q;
13 for (int i = 1; i <= n; i++)
14 if (d[i] == 0)
15 q.push(i);
16 while (!q.empty())
17 {
18 int cur = q.front();
19 ans[k++] = cur;
20 if (k == n + 1)
21 {
22 for (int i = 1; i < k; i++)
23 cout << ans[i] << " ";
24 return ;
25 }
26 q.pop();
27 for (int i = 0; i < vec[cur].size(); i++)
28 {
29 int t = vec[cur][i];
30 d[t]--;
31 if (d[t] == 0)
32 q.push(t);
33 }
34 }
35 cout << -1;
36 }
37
38 int main()
39 {
40 cin >> n >> e;
41 for (int i = 1; i <= e; i++)
42 {
43 int x, y;
44 cin >> x >> y;
45 d[y]++;
46 vec[x].push_back(y);
47 }
48 topological();
49 return 0;
50 }
假设输入的 n,e,x,y 均是不超过 10000 以内的正整数,完成下面的判断题和单选题:
21、对于输入的任意的 x1,y1和 x2,y2 交换输入顺序会影响结果。( ) {{ select(21) }}
- 正确
- 错误
22、第 24 行的 return 语句去掉也不影响结果。( ) {{ select(22) }}
- 正确
- 错误
23、第 46 行 vec[x].push_back(y)可以修改为 vec[x] = y,不影响结果。( ) {{ select(23) }}
- 正确
- 错误
24、该代码的时间复杂度为( )。 {{ select(24) }}
- O(n)
- O(elogn)
- O(n+e)
- O(ne)
25、若输入
6 8
1 2
1 4
2 6
3 2
3 6
5 1
5 6
5 2
则输出为( )。 {{ select(25) }}
- 3 5 1 2 4 6
- 5 1 4 3 2 6
- 2 4 6 1 3 5
- 3 5 1 4 2 6
26、以下哪种输入情况会输出-1( )。 {{ select(26) }}
- 4 6 1 2 1 3 2 3 4 1 4 2 4 3
- 4 6 1 2 1 3 1 4 2 3 4 2 4 3
- 4 6 1 2 1 3 1 4 3 2 3 4 4 2
- 4 6 1 2 1 3 2 3 3 4 4 1 4 2
01 #include <iostream>
02 using namespace std;
03 int q[500005], head, tail;
04 int sum[500005], n, m, k, mx = -2147483648u;
05 int main()
06 {
07 cin >> n >> m;
08 for (int i = 1; i <= n; ++i)
09 {
10 cin >> k;
11 sum[i] = sum[i - 1] + k;
12 }
13 q[tail] = 0;
14 tail++;
15 for (int i = 1; i <= n; ++i)
16 {
17 while (head < tail && i - q[head] > m)
18 {
19 head++;
20 }
21 mx = max(mx, sum[i] - sum[q[head]]);
22 while (head < tail && sum[i] <= sum[q[tail - 1]])
23 {
24 tail--;
25 }
26 q[tail] = i;
27 tail++;
28 }
29 cout << mx;
30 return 0;
31 }
保证 1<=n<=5*10^5
27.该算法最准确的时间复杂度分析结果为 O(n^2)。 () {{ select(27) }}
- 正确
- 错误
28.当输入的 k 均为负数时,输出为输入的最大值。 () {{ select(28) }}
- 正确
- 错误
29.当输入的 n 等于 m 时,输出为 n 个数的和。 () {{ select(29) }}
- 正确
- 错误
30.当输入为 6 4 1 -3 5 1 -2 3 时,输出为()。 {{ select(30) }}
- 6
- 7
- 11
- 13
31.当输入的 n=100,m=50,k 为从 1 开始每次增加 2 的奇数时,输出为()。 {{ select(31) }}
- 15000
- 15050
- 7500
- 7550
32.当输入均为 n 时,输出为()。 {{ select(32) }}
- n
- 2*n
- n^2
- 2^n
三、完善程序(单选题,每小题 3 分,共计 30 分)
- (等比数列)第一行输入一个正整数 n,第二行输入 n 个整数,判断这些数是否构成等比数 列。
试补全程序。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, q, pre, now, i; cin >> n;
①
②
pre = now;
for (i = 3; i <= n; i++) {
cin >> now;
if (③)
break;
q = now / pre;
④
}
if(⑤)
cout << "Yes";
else
cout << "No";
return 0;
}
33.①处应填( )。 {{ select(33) }}
- cin >> pre;
- cin >> pre >> now;
- cin >> now;
- cin >> now >> pre;
34.②处应填( )。 {{ select(34) }}
- q = 1;
- q = now / pre;
- q = 0;
- q = pre / now;
35.③处应填( )。 {{ select(35) }}
- now != pre*q
- now == pre*q
- now < pre
- now > pre
36.④处应填( )。 {{ select(36) }}
- now = pre;
- now = q;
- pre = q;
- pre = now;
37.⑤处应填( )。 {{ select(37) }}
- n
- i > n
- i < n
- i <= n
- (三分查找) 三分查找是一种查找算法,用于在有序序列中查找特定元素。该算法从序列 中选择一个中心点,将序列分成三个部分,并检查目标值是否在其中一个部分中。如果目标 值在部分中,则查找结束。如果目标值不在部分中,则继续在剩余的两个部分中进行查找。 直到找到目标值,或者查找范围为空。 试补全程序
#include<iostream>
using namespace std;
int a[100000005];
int search(int left, int right, int x) {
if (①) return -1;
else if (left + 1 == right || left == right) {
if (a[left] == x) return left;
else if (a[right] == x) return right;
else return ②;
}
int l = (right - left + 1) / 3;
int lbound = left + l, rbound = right - l;
if (a[lbound] == x) return lbound;
else if (x < a[lbound]) return ③;
else if (a[rbound] == x) return rbound;
else if (x < a[rbound]) return search(lbound + 1, rbound - 1, x);
else return ④;
}
int main() {
int n, targe;
cin >> n >> targe;
for (int i = 1; i <= n; i++) cin >> a[i];
cout << ⑤;
return 0;
}
38.①处应填( )。 {{ select(38) }}
- left >= right
- left > right
- right >= left
- right > left
39.②处应填( )。 {{ select(39) }}
- -1
- 0
- left - 1
- left + 1
40.③处应填( )。 {{ select(40) }}
- search(1, lbound, x)
- search(left, lbound - 1, x)
- search(left, n, x)
- search(left, lbound - l, x)
41.④处应填( )。 {{ select(41) }}
- search(rbound, n, x)
- search(1, right, x)
- search(rbound + l, right, x)
- search(rbound + 1, right, x)
42.⑤处应填( )。 {{ select(42) }}
- search(0, n - 1, targe)
- search(0, n - 1, 0)
- search(1, n, targe)
- search(1, n, 0)