#14. CSP-J 2026 第一轮模拟赛(第 04 套)
CSP-J 2026 第一轮模拟赛(第 04 套)
CSP-J 2026 第一轮模拟赛(第 04 套)
满分:100 分 建议用时:120 分钟
所有题目均为单项选择题。判断题中,
T表示正确,F表示错误。未作答按 0 分计算。
一、单项选择题(共 15 题,每题 2 分,共 30 分)
第 1 题(2 分)
十进制整数 49 转换为二进制数,结果是( )。
{{ select(1) }}
110011110000110010110001
第 2 题(2 分)
十六进制数 (3E)₁₆ 对应的十进制数是( )。
{{ select(2) }}
- 54
- 62
- 74
- 68
第 3 题(2 分)
设 int a=22, b=19, c=3; 表达式 (a & b) ^ c 的值是( )。
{{ select(3) }}
- 21
- 17
- 19
- 18
第 4 题(2 分)
一幅 64×40 的黑白位图,每个像素只需 1 bit,不考虑文件头,至少需要( )字节存储。
{{ select(4) }}
2560640320160
第 5 题(2 分)
关于程序的编译与运行,下列说法正确的是( )。
{{ select(5) }}
- 链接阶段会把目标文件与所需库代码组合成可执行文件。
- 编译器只能检查程序运行结果是否正确,不能发现语法错误。
- 源程序只要保存为 .cpp 文件,就一定可以被 CPU 直接执行。
- 链接过程发生在程序每一次循环执行之后。
第 6 题(2 分)
关于计算机网络,下列说法正确的是( )。
{{ select(6) }}
- DNS 是一种排序算法。
- HTTP 只能在局域网中使用。
- TCP 完全不需要建立连接。
- UDP 是无连接的传输层协议,通常不保证可靠到达。
第 7 题(2 分)
一个初始为空的栈依次执行 push(7)、push(9)、pop()、push(11),此时栈顶元素是( )。
{{ select(7) }}
- 7
- 11
- 9
- 栈为空
第 8 题(2 分)
一棵含 15 个结点的树共有( )条边。
{{ select(8) }}
- 14
- 15
- 28
- 16
第 9 题(2 分)
一个含 10 个顶点的无向连通图,边数至少为( )。
{{ select(9) }}
- 9
- 8
- 10
- 45
第 10 题(2 分)
关于快速排序,下列说法正确的是( )。
{{ select(10) }}
它一定需要 O(n²) 的额外存储空间。平均时间复杂度为 O(n log n),最坏可达到 O(n²)。它在任何情况下都只需 O(n) 时间。- 它不能用于整数序列。
第 11 题(2 分)
在含 15 个互不相同且已升序排列的元素中,用标准二分查找成功查找一个元素,最多进行( )次关键字比较。
{{ select(11) }}
- 5
- 4
- 15
- 3
第 12 题(2 分)
下面程序片段的时间复杂度是( )。
for (int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
x++;
{{ select(12) }}
O(n)O(log n)O(2ⁿ)O(n²)
第 13 题(2 分)
从 10 名同学中任选 2 名组成一组,共有( )种不同选法。
{{ select(13) }}
- 45
- 90
- 20
1024
第 14 题(2 分)
执行 int x=32, y=5; cout << x / y + x % y;,输出是( )。
{{ select(14) }}
- 11
- 9
- 6
- 8
第 15 题(2 分)
解决“在有序数组中不断舍弃一半搜索区间”时,最符合描述的方法是( )。
{{ select(15) }}
- 枚举所有排列
- 选择排序
- 二分查找
- 深度优先搜索(DFS)
二、阅读程序(共 18 题,共 40 分)
阅读下列程序。判断题请选择
T或F,其他题请选择A、B、C、D。
程序 1:数组循环左移(第 16~21 题)
输入满足 n ≥ 1、k ≥ 0。
#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;
k %= n;
reverse(a.begin(), a.begin() + k);
reverse(a.begin() + k, a.end());
reverse(a.begin(), a.end());
long long ans = 0;
for (int i = 0; i < n; ++i)
ans += 1LL * (i + 1) * a[i];
cout << ans << "\n";
}
第 16 题(1 分)
三次 reverse 的结果是把数组循环左移 k 位。
{{ select(16) }}
- T
- F
第 17 题(1.5 分)
若 k 是 n 的倍数,数组最终顺序不变。
{{ select(17) }}
- T
- F
第 18 题(1.5 分)
ans 使用 long long 可以降低乘加溢出的风险。
{{ select(18) }}
- T
- F
第 19 题(3 分)
输入:
5 2
1 2 3 4 5
旋转后的数组是( )。
{{ select(19) }}
5 1 2 3 43 4 5 1 22 3 4 5 14 5 1 2 3
第 20 题(3 分)
上述输入最终输出是( )。
{{ select(20) }}
- 40
- 37
- 38
- 39
第 21 题(3 分)
该算法除存储数组外的额外空间复杂度为( )。
{{ select(21) }}
O(n)O(1)O(n²)O(log n)
程序 2:二分查找插入位置(第 22~27 题)
数组下标从0开始。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
vector<int> a(n);
for (int &v : a)
cin >> v;
int l = 0, r = n;
while (l < r) {
int mid = (l + r) / 2;
if (a[mid] < x)
l = mid + 1;
else
r = mid;
}
cout << l << "\n";
}
第 22 题(1.5 分)
程序要求数组按非递减顺序排列。
{{ select(22) }}
- T
- F
第 23 题(1.5 分)
输出一定是某个等于 x 的元素下标。
{{ select(23) }}
- T
- F
第 24 题(1.5 分)
输出是第一个不小于 x 的位置。
{{ select(24) }}
- T
- F
第 25 题(3 分)
输入:
6 4
1 2 4 4 7 9
输出是( )。
{{ select(25) }}
- 4
- 1
- 3
- 2
第 26 题(3 分)
输入:
5 8
1 3 5 7 9
输出是( )。
{{ select(26) }}
- 4
- -1
- 5
- 3
第 27 题(3 分)
若所有元素都小于 x,输出为( )。
{{ select(27) }}
n-1- 0
- n
- -1
程序 3:子集和计数(第 28~33 题)
n 较小,且所有 a[i] 为正整数。
#include <bits/stdc++.h>
using namespace std;
int n, T, a[20], ans = 0;
void dfs(int p, int sum) {
if (p == n) {
if (sum == T)
++ans;
return;
}
dfs(p + 1, sum);
dfs(p + 1, sum + a[p]);
}
int main() {
cin >> n >> T;
for (int i = 0; i < n; i++)
cin >> a[i];
dfs(0, 0);
cout << ans << "\n";
}
第 28 题(1.5 分)
程序枚举每个元素选或不选的所有子集。
{{ select(28) }}
- T
- F
第 29 题(1.5 分)
若不同子集和相同,会分别计数。
{{ select(29) }}
- T
- F
第 30 题(1.5 分)
时间复杂度为 O(n²)。
{{ select(30) }}
- T
- F
第 31 题(3 分)
输入:
3 3
1 2 3
输出是( )。
{{ select(31) }}
- 1
- 3
- 4
- 2
第 32 题(3 分)
若 T = 0 且所有 a[i]>0,ans 至少为( )。
{{ select(32) }}
2^n- n
- 0
- 1
第 33 题(3 分)
递归树叶结点数量为( )。
{{ select(33) }}
- n²
2^n- n!
- n
三、完善程序(共 10 题,每题 3 分,共 30 分)
阅读程序说明和代码。代码中的横线表示待填空位置,请从对应的四个选项中选择最合适的一项。
完善程序(一):网格最短路 BFS(第 34~38 题)
功能说明: 在 0/1 网格中求从左上角到右下角的最短步数,其中字符 1 表示可以通行。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<string> g(n);
for (auto &s : g)
cin >> s;
vector<vector<int>> d(n, vector<int>(m, -1));
queue<pair<int, int>> q;
if (g[0][0] == '1') {
d[0][0] = 0;
________(1)________;
}
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
while (________(2)________) {
auto [x, y] = q.front();
q.pop();
for (int k = 0; k < 4; ++k) {
int nx = x + dx[k];
int ny = y + dy[k];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && g[nx][ny] == '1'
&& ________(3)________) {
d[nx][ny] = ________(4)________;
q.push({nx, ny});
}
}
}
cout << ________(5)________ << '\n';
return 0;
}
第 34 题(3 分)
空(1)应填入( )。
{{ select(34) }}
return 0q.pop()d[0][0]=-1q.push({0,0})
第 35 题(3 分)
空(2)应填入( )。
{{ select(35) }}
!q.empty()q.empty()d[0][0]==-1n--
第 36 题(3 分)
空(3)应填入( )。
{{ select(36) }}
d[nx][ny]==-1g[x][y]==0nx==nyd[nx][ny]!=-1
第 37 题(3 分)
空(4)应填入( )。
{{ select(37) }}
0d[nx][ny]+11d[x][y]+1
第 38 题(3 分)
空(5)应填入( )。
{{ select(38) }}
q.size()d[n-1][m-1]n+md[0][0]
完善程序(二):归并两个有序数组(第 39~43 题)
功能说明: 合并两个升序数组,并按升序输出合并结果。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n), b(m), c;
for (int &x : a)
cin >> x;
for (int &x : b)
cin >> x;
int i = 0, j = 0;
while (________(1)________) {
if (j == m || (i < n && ________(2)________))
c.push_back(________(3)________);
else
c.push_back(________(4)________);
}
for (int x : c)
________(5)________;
return 0;
}
第 39 题(3 分)
空(1)应填入( )。
{{ select(39) }}
i==nj==mi<n||j<mi<n&&j<m
第 40 题(3 分)
空(2)应填入( )。
{{ select(40) }}
i<ja[i]>b[j]a[i]<=b[j]a[i]==0
第 41 题(3 分)
空(3)应填入( )。
{{ select(41) }}
b[i++]a[i++]b[j++]a[j++]
第 42 题(3 分)
空(4)应填入( )。
{{ select(42) }}
c.back()b[j++]a[i++]j++
第 43 题(3 分)
空(5)应填入( )。
{{ select(43) }}
sort(c.begin(),c.end())return xcin>>xcout<<x<<' '