#20. CSP-J 2026 第一轮模拟赛(第 10 套)
CSP-J 2026 第一轮模拟赛(第 10 套)
CSP-J 2026 第一轮模拟赛(第 10 套)
满分:100 分 建议用时:120 分钟
所有题目均为单项选择题。判断题中,
T表示正确,F表示错误。未作答按 0 分计算。
一、单项选择题(共 15 题,每题 2 分,共 30 分)
第 1 题(2 分)
十进制整数 67 转换为二进制数,结果是( )。
{{ select(1) }}
1000011100010110000101000100
第 2 题(2 分)
十六进制数 (5C)₁₆ 对应的十进制数是( )。
{{ select(2) }}
- 84
- 92
- 98
104
第 3 题(2 分)
设 int a=28, b=31, c=5; 表达式 (a & b) ^ c 的值是( )。
{{ select(3) }}
- 29
- 25
- 27
- 26
第 4 题(2 分)
一幅 96×40 的黑白位图,每个像素只需 1 bit,不考虑文件头,至少需要( )字节存储。
{{ select(4) }}
4802409603840
第 5 题(2 分)
关于程序的编译与运行,下列说法正确的是( )。
{{ select(5) }}
- 编译器只能检查程序运行结果是否正确,不能发现语法错误。
- 源程序只要保存为 .cpp 文件,就一定可以被 CPU 直接执行。
- 编译器的主要作用是把高级语言源程序转换为机器能够执行或进一步处理的目标代码。
- 链接过程发生在程序每一次循环执行之后。
第 6 题(2 分)
关于计算机网络,下列说法正确的是( )。
{{ select(6) }}
- 路由器只能连接同一台计算机内部的设备。
- HTTP 属于物理层协议。
- TCP 面向连接,并提供可靠的字节流传输。
- UDP 一定比 TCP 可靠。
第 7 题(2 分)
一个初始为空的栈依次执行 push(13)、push(15)、pop()、push(17),此时栈顶元素是( )。
{{ select(7) }}
- 栈为空
- 13
- 15
- 17
第 8 题(2 分)
一棵含 27 个结点的树共有( )条边。
{{ select(8) }}
- 28
- 52
- 27
- 26
第 9 题(2 分)
一个含 16 个顶点的无向连通图,边数至少为( )。
{{ select(9) }}
120- 15
- 14
- 16
第 10 题(2 分)
关于插入排序,下列说法正确的是( )。
{{ select(10) }}
- 对接近有序的数据通常表现较好,并可以稳定实现。
- 它不能用于整数序列。
它在任何情况下都只需 O(n) 时间。它一定需要 O(n²) 的额外存储空间。
第 11 题(2 分)
在含 63 个互不相同且已升序排列的元素中,用标准二分查找成功查找一个元素,最多进行( )次关键字比较。
{{ select(11) }}
- 5
- 7
- 6
- 63
第 12 题(2 分)
下面程序片段的时间复杂度是( )。
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
x++;
{{ select(12) }}
O(n²)O(n)O(2ⁿ)O(log n)
第 13 题(2 分)
从 16 名同学中任选 2 名组成一组,共有( )种不同选法。
{{ select(13) }}
240120- 32
65536
第 14 题(2 分)
执行 int x=50, y=5; cout << x / y + x % y;,输出是( )。
{{ select(14) }}
- 8
- 11
- 13
- 10
第 15 题(2 分)
解决“按当前局部最优选择逐步构造方案”时,最符合描述的方法是( )。
{{ select(15) }}
- 贪心
- 选择排序
- 枚举所有排列
- 深度优先搜索(DFS)
二、阅读程序(共 18 题,共 40 分)
阅读下列程序。判断题请选择
T或F,其他题请选择A、B、C、D。
程序 1:滑动窗口最大和(第 16~21 题)
输入满足 1≤k≤n。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> a(n);
for (int &x : a)
cin >> x;
long long sum = 0;
for (int i = 0; i < k; ++i)
sum += a[i];
long long best = sum;
for (int i = k; i < n; ++i) {
sum += a[i] - a[i - k];
best = max(best, sum);
}
cout << best << "\n";
}
第 16 题(1 分)
程序求长度恰好为 k 的连续子段最大和。
{{ select(16) }}
- T
- F
第 17 题(1.5 分)
程序要求 1≤k≤n。
{{ select(17) }}
- T
- F
第 18 题(1.5 分)
若所有元素为负数,best 仍能得到正确的最大窗口和。
{{ select(18) }}
- T
- F
第 19 题(3 分)
输入:
6 2
4 -1 3 5 -2 6
输出是( )。
{{ select(19) }}
- 10
- 7
- 9
- 8
第 20 题(3 分)
将上一题选项修正后,正确输出为( )。
{{ select(20) }}
- 8
- 7
- 9
- 6
第 21 题(3 分)
程序的时间复杂度为( )。
{{ select(21) }}
O(k)O(n²)O(n)O(nk)
程序 2:并查集(第 22~27 题)
操作1合并,操作2查询。
#include <bits/stdc++.h>
using namespace std;
vector<int> p;
int find(int x) {
return p[x] == x ? x : p[x] = find(p[x]);
}
int main() {
int n, m;
cin >> n >> m;
p.resize(n + 1);
iota(p.begin(), p.end(), 0);
while (m--) {
int op, a, b;
cin >> op >> a >> b;
if (op == 1) {
a = find(a);
b = find(b);
if (a != b)
p[a] = b;
} else
cout << (find(a) == find(b) ? "Y" : "N") << ' ';
}
}
第 22 题(1.5 分)
程序使用并查集维护元素之间的连通关系。
{{ select(22) }}
- T
- F
第 23 题(1.5 分)
find 中包含路径压缩。
{{ select(23) }}
- T
- F
第 24 题(1.5 分)
代码使用了按秩合并。
{{ select(24) }}
- T
- F
第 25 题(3 分)
输入:
4 5
1 1 2
2 1 3
1 2 3
2 1 3
2 3 4
输出是( )。
{{ select(25) }}
Y N NY Y NN Y NN N Y
第 26 题(3 分)
初始化后,每个元素的父亲是( )。
{{ select(26) }}
- n
- 自己
- 前一个元素
- 0
第 27 题(3 分)
并查集最适合处理( )。
{{ select(27) }}
- 动态连通性查询
- 矩阵乘法
- 字符串排序
- 浮点数开方
程序 3:完全背包计数(第 28~33 题)
硬币面值固定为1、2、5。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<long long> dp(n + 1);
dp[0] = 1;
for (int coin : {1, 2, 5})
for (int s = coin; s <= n; s++)
dp[s] += dp[s - coin];
cout << dp[n] << "\n";
}
第 28 题(1.5 分)
程序统计使用1、2、5面值硬币凑出n的组合方案数。
{{ select(28) }}
- T
- F
第 29 题(1.5 分)
硬币可以使用任意枚。
{{ select(29) }}
- T
- F
第 30 题(1.5 分)
若交换两层循环,会统计同一组硬币的不同排列。
{{ select(30) }}
- T
- F
第 31 题(3 分)
输入 5,输出是( )。
{{ select(31) }}
- 5
- 4
- 3
- 6
第 32 题(3 分)
dp[0] 初始化为1的作用是( )。
{{ select(32) }}
- 表示凑出0有一种空方案
- 避免数组越界
- 让所有答案加1
- 表示有一枚0元硬币
第 33 题(3 分)
时间复杂度为( )。
{{ select(33) }}
O(n²)O(2^n)O(1)O(n)
三、完善程序(共 10 题,每题 3 分,共 30 分)
阅读程序说明和代码。代码中的横线表示待填空位置,请从对应的四个选项中选择最合适的一项。
完善程序(一):爬楼梯(第 34~38 题)
功能说明: 每次可以走 1 级或 2 级楼梯,求到达第 n 级的方案数。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<long long> dp(n + 2);
dp[0] = ________(1)________;
for (int i = 1; i <= n; ++i) {
dp[i] += ________(2)________;
if (i >= 2)
dp[i] += ________(3)________;
}
cout << ________(4)________ << ________(5)________;
return 0;
}
第 34 题(3 分)
空(1)应填入( )。
{{ select(34) }}
012n
第 35 题(3 分)
空(2)应填入( )。
{{ select(35) }}
dp[i+1]dp[i-1]dp[i]1
第 36 题(3 分)
空(3)应填入( )。
{{ select(36) }}
dp[i-1]dp[i-2]i2
第 37 题(3 分)
空(4)应填入( )。
{{ select(37) }}
dp[n]dp[n+1]ndp[0]
第 38 题(3 分)
空(5)应填入( )。
{{ select(38) }}
"\n"return 0dp[0]n
完善程序(二):并查集(第 39~43 题)
功能说明: 支持合并两个集合,并查询两个元素是否属于同一个集合。
#include <bits/stdc++.h>
using namespace std;
vector<int> p;
int find(int x) {
if (p[x] == x)
return x;
return p[x] = ________(1)________;
}
int main() {
int n, m;
cin >> n >> m;
p.resize(n + 1);
for (int i = 1; i <= n; ++i)
p[i] = ________(2)________;
while (m--) {
int op, a, b;
cin >> op >> a >> b;
if (op == 1) {
a = ________(3)________;
b = find(b);
if (a != b)
p[a] = ________(4)________;
} else {
cout << (find(a) == find(b) ? ________(5)________ : "N") << '\n';
}
}
return 0;
}
第 39 题(3 分)
空(1)应填入( )。
{{ select(39) }}
p[x]+1find(p[x])find(x)x
第 40 题(3 分)
空(2)应填入( )。
{{ select(40) }}
in01
第 41 题(3 分)
空(3)应填入( )。
{{ select(41) }}
p[a]find(a)find(b)a+1
第 42 题(3 分)
空(4)应填入( )。
{{ select(42) }}
p[b]0ab
第 43 题(3 分)
空(5)应填入( )。
{{ select(43) }}
a"YES"1"Y"