#P1498. 普及组 CSP-J 2026 初赛模拟卷 6
普及组 CSP-J 2026 初赛模拟卷 6
普及组 CSP-J 2026 初赛模拟卷 6
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
第 1 题
{{ select(1) }} 在计算机系统中,操作系统的主要作用是( )。
- 将用高级语言编写的程序翻译成机器语言
- 管理和控制计算机的硬件与软件资源
- 进行科学计算
- 防范计算机病毒
第 2 题
{{ select(2) }}
在 NOI Linux 中,使用 g++ 编译一个名为 main.cpp 的源文件,并指定生成的可执行文件名为 main,正确的命令是( )。
g++ -o main main.cppg++ main.cpp -o maing++ main.cpp maing++ main -o main.cpp
第 3 题
{{ select(3) }} 对序列 进行直接插入排序,在完成前 个元素 的排序后,序列的状态是( )。
第 4 题
{{ select(4) }}
对于变量 ,,表达式 (x ^ y) & ~(x & y) 的结果是( )。
- 25
- 30
- 0
- 7
第 5 题
{{ select(5) }} 下列几种排序算法中,在最坏情况下,( )的时间复杂度与其他三种不同。
- 冒泡排序
- 选择排序
- 插入排序
- 归并排序
第 6 题
{{ select(6) }} 十六进制数 与二进制数 的关系是( )。
- 前者比后者大
- 后者比前者大
- 两者相等
- 前者是后者的两倍
第 7 题
{{ select(7) }} 对几乎已经排好序的数据(只有少数元素位置不对)进行排序,( )算法最快。
- 快速排序
- 插入排序
- 归并排序
- 选择排序
第 8 题
{{ select(8) }} 一个项目团队中,每个成员都与其他恰好 个成员有直接协作关系。如果团队有 人,那么协作关系总共有( )种。
- 18
- 36
- 12
- 4
第 9 题
{{ select(9) }} 一个栈的入栈序列为 。出栈序列中, 是第一个出栈的元素。出栈序列( )是不可能的。
第 10 题
{{ select(10) }} 从 中选出 个不同的数,使得其中任意两个数的差都不小于 ,不同的选法有( )种。
- 35
- 70
- 84
- 120
以下代码段的时间复杂度是( )。
for (int i = n; i > 0; i /= 2, cout<<endl) {
for (int j = 0; j < i; j++) {
cout << i * j << " ";
}
}
第 11 题
{{ select(11) }}
第 12 题
{{ select(12) }} 对长度为 的有序数组进行二分查找,( )不是必须满足的条件。
- 数组元素必须连续存储
- 数组必须按关键字有序
- 必须能够随机访问元素
- 数据量 最好较大
第 13 题
{{ select(13) }} 一棵二叉树的前序遍历序列是 ABDECF,中序遍历序列是 DBEAFC,则其后序遍历序列是( )。
- DEBFCA
- DEBFAC
- DBEFCA
- DBECFA
第 14 题
{{ select(14) }}
循环队列容量为 ,front = 7,rear = 3,元素个数为( )。
- 4
- 5
- 6
- 7
第 15 题
{{ select(15) }} 使用邻接表存储图,拓扑排序的时间复杂度是( )。
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 ,错误填 ;除特殊说明外,判断题每题 分,选择题每题 分,共计 分)
(1)
#include <iostream>
#include <vector>
using namespace std;
int solve(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++)
if (n % i == 0) sum += i;
return sum;
}
int main() {
int n;
cin >> n;
int sum = solve(n);
if (sum == n) {
cout << "perfect_number" << endl;
} else if (sum > n) {
cout << "abundant_number" << endl;
} else {
cout << "deficient_number" << endl;
}
return 0;
}
判断题
第 16 题
{{ input(16) }}
函数 solve 计算的是 的所有因数之和。
第 17 题
{{ input(17) }}
如果 是素数,那么 solve 的返回值总是 。
第 18 题
{{ input(18) }} 当 时,程序会输出 "perfect number"。
选择题
第 19 题
{{ select(19) }} 的取值区间为 时,第一个输出 "abundant number" 的 是( )。
- 10
- 12
- 28
- 72
第 20 题
{{ select(20) }} 的取值区间为 时,关于完全数(perfect number),以下说法中正确的是( )。
- 所有完全数都是奇数
- 所有完全数都是偶数
- 完全数可以是素数
- 完全数的个数是无限的
(2)
#include <bits/stdc++.h>
using namespace std;
const int N = 10009;
int n, nums[N];
int solve() {
int res = n;
for (int i = 0; i < n; i++) {
res ^= i;
res ^= nums[i];
}
return res;
}
int main() {
cin >> n;
// 保证输入的 n 个数在 0..n 范围内,且互不相同
for (int i = 0; i < n; i++) cin >> nums[i];
cout << solve() << endl;
return 0;
}
判断题
第 21 题
{{ input(21) }}
若输入 5 1 2 3 4 5,则输出结果是 。
第 22 题
{{ input(22) }}
本题输入 num 数组的数据可以是无序的。
第 23 题
{{ input(23) }} 程序功能是判断 个数是不是连续的,如果不是连续的,则输出其中缺失的数。
选择题
第 24 题
{{ select(24) }} (4 分)
若输入 7 7 1 6 2 5 3 0,则输出结果是( )。
- 0
- 3
- 4
- 8
第 25 题
{{ select(25) }} (4 分) 算法利用的最主要的性质是( )。
- 异或的交换律和结合律
- 异或的交换律和分配律
- 异或的结合律和分配律
- 异或的交换律和幂零性
(3)
#include <bits/stdc++.h>
using namespace std;
const int N = 100009;
const int INF = 1e8 - 1;
int a[N];
int main() {
int n, x;
cin >> n >> x;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n, less<int>());
int left = 0, right = n - 1, p = n;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid] > x) {
p = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
cout << p << "\n";
if (p < n) cout << a[p] << endl;
else cout << INF << endl;
return 0;
}
判断题
第 26 题
{{ input(26) }} 该程序使用二分查找,找到第一个大于或等于 的元素的下标和数值。
第 27 题
{{ input(27) }}
当输入 7 8 0 9 2 7 8 7 6 时,程序输出为 ""。
第 28 题
{{ input(28) }}
数组排序后,也可以使用 upper_bound(a,a+n,x)-a 得到 的数值。
选择题
第 29 题
{{ select(29) }} (4 分)
当输入 8 7 3 4 4 5 5 6 6 7 时,程序输出为( )。
- 7 7
- 8 7
- 8 9999999
- 8 99999999
第 30 题
{{ select(30) }} (4 分) 对于输入的 个数的序列,下列说法中正确的是( )。
- 序列中的元素可以从大到小有序
- 序列中的元素可以从小到大有序
- 序列中的元素可以无序
- 以上说法都正确
三、完善程序(单选题,每小题 分,共计 分)
(1)(汉诺塔问题)有三根柱子 A、B、C,其中 A 柱上叠放有 个大小不同的圆盘,按大小顺序从下到上排列(最大的在最下面,最小的在最上面)。目标是将所有圆盘从 A 柱移动到 C 柱,并遵循以下规则:每次只能移动一个圆盘;移动过程中,任何柱子上都不能出现大圆盘在小圆盘上方的情况;可以使用 B 柱作为辅助。请输出所有操作步骤(将圆盘从一根柱子移动到另一根柱子,如:A->B),并在最后统计总的移动次数。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll steps = 0;
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
cout << A << "->" << C << endl;
①
} else {
hanoi(n - 1, A, C, B);
②
steps++;
③
}
}
int main() {
int n;
cin >> n;
if (n <= 0) {
cout << 0 << endl;
④
}
⑤
cout << steps << endl;
return 0;
}
第 31 题
{{ select(31) }} ①处应填( )。
return;steps=1;steps++;steps+=n;
第 32 题
{{ select(32) }} ②处应填( )。
cout << A << "->" << B << endl;cout << A << "->" << C << endl;cout << B << "->" << C << endl;cout << C << "->" << B << endl;
第 33 题
{{ select(33) }} ③处应填( )。
hanoi(n - 1, A, B, C);hanoi(n - 1, A, C, B);hanoi(n - 1, B, A, C);hanoi(n - 1, B, C, A);
第 34 题
{{ select(34) }} ④处应填( )。
break;continue;n=0;return 0;
第 35 题
{{ select(35) }} ⑤处应填( )。
hanoi(1, 'A', 'B', 'C');hanoi(n, 'A', 'B', 'C');hanoi(1, 'A', 'C', 'B');hanoi(n, 'A', 'C', 'B');
(2)(Prim 算法)Prim 算法是一种用于求解带权无向连通图的最小生成树(MST)的贪心算法。它的基本思想是从图中任意一个顶点开始,逐步扩展生成树,每次选择一条连接生成树和其余顶点的权重最小的边,并将该边和对应的顶点加入生成树。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1009;
const ll INF = 1e9;
vector<int> to[N], w[N];
int n, m;
ll d[N]; // d[i]=i号顶点到当前 MST 的最小边权
bool ok[N]; // ok[i]=i号顶点是否在当前 MST 中
void add(int u, int v, int k) {
to[u].push_back(v);
to[v].push_back(u);
w[u].push_back(k);
w[v].push_back(k);
}
ll Prim() {
①
ll ans = 0;
d[1] = 0;
for (int k = 1; k <= n; k++) {
int u = ②;
for (int i = 1; i <= n; i++)
if (③ u = i;
ok[u] = 1;
ans += ④;
for (int i = 0; i < to[u].size(); i++) {
int v = to[u][i], cost = w[u][i];
if (⑤) d[v] = cost;
}
}
return ans;
}
int main() {
cin >> n >> m;
int u, v, k;
for (int i = 1; i <= m; i++) {
cin >> u >> v >> k;
add(u, v, k);
}
cout << Prim() << endl;
return 0;
}
第 36 题
{{ select(36) }} ①处应填( )。
fill(d, d + n + 1, -1);fill(d, d + n + 1, INF);fill(d, d + n + 2, -1);fill(d, d + n + 2, INF);
第 37 题
{{ select(37) }} ②处应填( )。
-10nn + 1
第 38 题
{{ select(38) }} ③处应填( )。
d[i] < d[u]d[i] > d[u]!ok[i] && d[i] < d[u]ok[i] && d[i] < d[u]
第 39 题
{{ select(39) }} ④处应填( )。
ud[u]kd[k]
第 40 题
{{ select(40) }} ⑤处应填( )。
!ok[v] && cost < d[v]!ok[v] && cost > d[v]ok[v] && cost < d[v]ok[v] && cost > d[v]