#J0011. CSP-J 2026 初赛模拟卷 1
CSP-J 2026 初赛模拟卷 1
信息学奥赛 CSP-J 2026 初赛模拟卷 1
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
- 启动计算机引导操作系统是将操作系统( )。 {{ select(1) }}
- 从磁盘调入中央处理器
- 从内存储器调入高速缓存存储器
- 从软盘调入硬盘
- 从系统盘调入内存储器
- 是一种( )操作系统。 {{ select(2) }}
- 单任务字符方式
- 单任务图形方式
- 多任务字符方式
- 多任务图形方式
- 在 点阵的字模中,汉字"一"与"编"的字模占用字节数分别是( )。 {{ select(3) }}
- 计算机的运算速度取决于给定时间内其处理器所能处理的数据量。处理器一次能处理的数据量称为字长。已知 位的奔腾处理器一次能处理 位,相当于( )字节。 {{ select(4) }}
- 算式 的结果是( )。 {{ select(5) }}
- 计算机的运算速度可以用 来描述,它的含义是( )。 {{ select(6) }}
- 每秒执行百万条指令
- 每秒处理百万个字符
- 每秒执行千万条指令
- 每秒处理千万个字符
- 设栈 的初始状态为空,现有 个元素组成的序列 ,对该序列在栈 上依次进行如下操作(从序列中的 开始,出栈后不再进栈):进栈、出栈、进栈、进栈、出栈、进栈、出栈、进栈。出栈的元素序列是( )。 {{ select(7) }}
- 在有 个叶节点的哈夫曼树中,节点总数为( )。 {{ select(8) }}
- 不确定
- 电线上停着两种鸟( 和 ),可以看出相邻的两只鸟将电线划分为一个线段。这些线段可分为两类:一类是线段两端的鸟种类相同,另一类是线段两端的鸟种类不同。已知电线的两个端点处恰好停着种类相同的鸟,那么两端的鸟种类不同的线段数目一定是( )。 {{ select(9) }}
- 奇数
- 偶数
- 可奇可偶
- 数目固定
- 从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端,这种排序方法称为( ) {{ select(10) }}
- 插入排序
- 归并排序
- 选择排序
- 快速排序
- 对于一棵满二叉树,若其叶节点数为 、分支节点数为 、总节点数为 ,则下列关系式恒成立的是( )。 {{ select(11) }}
- 以下不是操作系统名字的是( )。 {{ select(12) }}
- 以下不是个人计算机的硬件组成部分的是( )。 {{ select(13) }}
- 主板
- 虚拟内存
- 总线
- 硬盘
- 已知元素 ,这些元素以( )的顺序全部入栈,再全部出栈,可使栈的出栈顺序满足: 在 之前; 在 之后; 在 之后; 在 之前; 在 之后。 {{ select(14) }}
- 假设我们用向量 表示无向连通图 的 个顶点的度数,下面给出的( )组 值合理 {{ select(15) }}
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 ✓,错误填 ✗;除特殊说明外,判断题每题 2 分,选择题每题 3 分,共计 40 分)
(1)
1 #include <iostream>
2 #include <cmath>
3 using namespace std;
4 bool IsPrime(int num) {
5 for (int i=2; i<=sqrt(num); i++) {
6 if (num % i == 0) return false;
7 }
8 return true;
9 }
10 int main() {
11 int num = 0;
12 cin >> num;
13 if (IsPrime(num)) cout << "YES" << endl;
14 else cout << "NO" << endl;
15 return 0;
16 }
判断题
- 输入 时,输出为 。 ( ) {{ select(16) }}
- √
- ×
- 输入 时,输出为 。 ( ) {{ select(17) }}
- √
- ×
- 若将第 行的
<=改成<,程序输出不会改变。 ( ) {{ select(18) }}
- √
- ×
- 当程序执行第 行时, 的值为 。 ( ) {{ select(19) }}
- √
- ×
选择题
- 最坏情况下,此程序的时间复杂度是( )。 {{ select(20) }}
- 若输入为 以内的正整数,则输出 的概率是( )。 {{ select(21) }}
(2)
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int mod = 2048;
4 long long c,n;
5 long long kasumi(long long x,long long mi) {
6 long long res=1;
7 while (mi) {
8 if (mi & 1) {
9 res = (res * x) % mod;
10 }
11 x = (x * x) % mod;
12 mi >>= 1;
13 }
14 return res;
15 }
16 int main() {
17 cin >> n >> c;
18 if (n == 3) {
19 printf("%lld", c * (c - 1));
20 return 0;
21 }
22 long long ans = ((kasumi(c-1,n) + (c-1) * kasumi(-1,n)) % mod + mod) % mod;
23 cout << ans << endl;
24 return 0;
25 }
判断题
- 将第 行和第 行中的圆括号去掉,程序输出不变。 ( ) {{ select(22) }}
- √
- ×
- 将第 行的
mi >>= 1改为mi *= 0.5,程序输出不变。 ( ) {{ select(23) }}
- √
- ×
- 若输入
4 4,输出为 。 ( ) {{ select(24) }}
- √
- ×
- 此程序的时间复杂度为 。 ( ) {{ select(25) }}
- √
- ×
选择题
- ( 分)若输入
3 4,输出为( )。 {{ select(26) }}
(3)
1 #include <cstdio>
2 int n,r,num[10000];
3 bool mark[10000];
4 void print() {
5 for (int i=1; i<=r; i++)
6 printf("%d ", num[i]);
7 printf("\n");
8 }
9 void search(int x) {
10 for (int i=1; i<=n; i++)
11 if (!mark[i]) {
12 num[x] = i;
13 mark[i] = true;
14 if (x == r) print();
15 search(x + 1);
16 mark[i] = false;
17 }
18 }
19 int main() {
20 scanf("%d%d", &n, &r);
21 search(1);
22 }
判断题
- 程序结束时,对任意 ,都有 。 ( ) {{ select(27) }}
- √
- ×
- 若 ,则程序无输出。 ( ) {{ select(28) }}
- √
- ×
- 若输入
4 3,则输出中数字 和 的个数不同。 ( ) {{ select(29) }}
- √
- ×
- 此程序的时间复杂度是 。 ( ) {{ select(30) }}
- √
- ×
选择题
- 若输入
6 3,则函数print的执行次数为( )。 {{ select(31) }}
- 若输入
7 4,则输出的最后一行为( )。 {{ select(32) }}
4 5 6 77 6 5 44 3 2 11 2 3 4
三、完善程序(单选题,每小题 3 分,共计 30 分)
(1)
求最小生成树的思想:首先将 个点看作 个独立的集合,将所有边排序(从小到大)。然后按排好的顺序枚举每一条边,判断这条边连接的两个点是否属于同一集合。若不属于同一集合,则将这条边加入最小生成树,并将两个点所在的集合合并为一个集合。若属于同一集合,则跳过。直到找到 条边为止。
1 #include <iostream>
2 #include <algorithm>
3 using namespace std;
4 struct point { int x, y, v; } a[10000];
5 int cmp(const point &a, const point &b) {
6 if ( ① ) return 1;
7 return 0;
8 }
9 int fat[101];
10 int father(int x) {
11 if (fat[x] != x) return fat[x] = ② ;
12 return fat[x];
13 }
14 void unionn (int x, int y){
15 int fa = father(x), fb = father(y);
16 if (fa != fb) fat[fa] = fb;
17 }
18 int main() {
19 int i,j,n,m, k=0, ans=0, cnt=0;
20 cin >> n;
21 for (i=1; i<=n; i++)
22 for (j=1; j<=n; j++) {
23 cin >> m;
24 if (m != 0) {
25 k++; a[k].x=i; a[k].y=j; a[k].v=m;
26 }
27 }
28 sort(a+1, a+1+k, ③ );
29 for (i=1; i<=n; i++) fat[i] = i;
30 for (i=1; i<=k; i++){
31 if (father(a[i].x) != ④ ) {
32 ans += a[i].v;
33 unionn(a[i].x, a[i].y);
34 cnt++;
35 }
36 if ( ⑤ ) break;
37 }
38 cout << ans << endl;
39 return 0;
40 }
- ① 处应填( )。 {{ select(33) }}
a.v < b.va.v > b.va.v >= b.va.v <= b.v
- ② 处应填( )。 {{ select(34) }}
father(x)father(fat[x])fat[father(x)]x
- ③ 处应填( )。 {{ select(35) }}
algorithmpointcmpsizeof(a)
- ④ 处应填( )。 {{ select(36) }}
a[i].yfather(a[i].y)fat[a[i].y]a[i].x
- ⑤ 处应填( )。 {{ select(37) }}
cnt > 0i == 1ans == n-1cnt == n-1
(2)
欧拉路径问题是指从图中的一个顶点出发,是否能够一次性不回头地走遍所有的边(一次且仅一次)。算法代码如下。
1 #include <iostream>
2 using namespace std;
3 int G[5][5];
4 int visited[5][5];
5 int n = 5;
6 void euler(int u) {
7 for (int v=0; v<n; v++) {
8 if (G[u][v] && ① ) {
9 cout << u << "->" << v << endl;
10 visited[u][v] = visited[v][u] = ② ;
11 ③
12 }
13 }
14 }
15 int main() {
16 G[1][2] = G[2][1] = G[1][3] = ④ = 1;
17 G[2][4] = G[4][2] = G[3][4] = ⑤ = 1;
18 euler(1);
19 return 0;
20 }
- ① 处应填( )。 {{ select(38) }}
G[v][u]!visited[u][v]visited[u][v]visited[v][u]
- ② 处应填( )。 {{ select(39) }}
10uv
- ③ 处应填( )。 {{ select(40) }}
euler(v);euler(u);G[u][v]=0;G[v][u]=0;
- ④ 处应填( )。 {{ select(41) }}
G[0][1]G[1][0]G[3][1]G[0][3]
- ⑤ 处应填( )。 {{ select(42) }}
G[0][2]G[2][0]G[2][1]G[4][3]