#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.cpp
  • g++ main.cpp -o main
  • g++ main.cpp main
  • g++ main -o main.cpp

第 3 题

{{ select(3) }} 对序列 {5,2,4,6,1,3}\{5,2,4,6,1,3\} 进行直接插入排序,在完成前 33 个元素 (5,2,4)(5,2,4) 的排序后,序列的状态是( )。

  • {2,4,5,6,1,3}\{2,4,5,6,1,3\}
  • {2,5,4,6,1,3}\{2,5,4,6,1,3\}
  • {4,2,5,6,1,3}\{4,2,5,6,1,3\}
  • {5,2,4,6,1,3}\{5,2,4,6,1,3\}

第 4 题

{{ select(4) }} 对于变量 x=25x=25,y=7y=7,表达式 (x ^ y) & ~(x & y) 的结果是( )。

  • 25
  • 30
  • 0
  • 7

第 5 题

{{ select(5) }} 下列几种排序算法中,在最坏情况下,( )的时间复杂度与其他三种不同。

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 归并排序

第 6 题

{{ select(6) }} 十六进制数 0xDEAD0xDEAD 与二进制数 1101 1110 1010 11011101\ 1110\ 1010\ 1101 的关系是( )。

  • 前者比后者大 11
  • 后者比前者大 11
  • 两者相等
  • 前者是后者的两倍

第 7 题

{{ select(7) }} 对几乎已经排好序的数据(只有少数元素位置不对)进行排序,( )算法最快。

  • 快速排序
  • 插入排序
  • 归并排序
  • 选择排序

第 8 题

{{ select(8) }} 一个项目团队中,每个成员都与其他恰好 33 个成员有直接协作关系。如果团队有 1212 人,那么协作关系总共有( )种。

  • 18
  • 36
  • 12
  • 4

第 9 题

{{ select(9) }} 一个栈的入栈序列为 1,2,3,4,51,2,3,4,5。出栈序列中,44 是第一个出栈的元素。出栈序列( )是不可能的。

  • 4,5,3,2,14,5,3,2,1
  • 4,3,5,2,14,3,5,2,1
  • 4,2,3,5,14,2,3,5,1
  • 4,1,2,3,54,1,2,3,5

第 10 题

{{ select(10) }} 从 1,2,3,⋯ ,101,2,3,\cdots,10 中选出 44 个不同的数,使得其中任意两个数的差都不小于 22,不同的选法有( )种。

  • 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) }}

  • O(n)O(n)
  • O(nlog⁡n)O(n\log n)
  • O(n2)O(n^2)
  • O(log⁡n)O(\log n)

第 12 题

{{ select(12) }} 对长度为 nn 的有序数组进行二分查找,( )不是必须满足的条件。

  • 数组元素必须连续存储
  • 数组必须按关键字有序
  • 必须能够随机访问元素
  • 数据量 nn 最好较大

第 13 题

{{ select(13) }} 一棵二叉树的前序遍历序列是 ABDECF,中序遍历序列是 DBEAFC,则其后序遍历序列是( )。

  • DEBFCA
  • DEBFAC
  • DBEFCA
  • DBECFA

第 14 题

{{ select(14) }} 循环队列容量为 1010,front = 7,rear = 3,元素个数为( )。

  • 4
  • 5
  • 6
  • 7

第 15 题

{{ select(15) }} 使用邻接表存储图,拓扑排序的时间复杂度是( )。

  • O(V)O(V)
  • O(E)O(E)
  • O(V+E)O(V + E)
  • O(V2)O(V^2)

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √\surd,错误填 ×\times;除特殊说明外,判断题每题 22 分,选择题每题 33 分,共计 4040 分)

(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 计算的是 nn 的所有因数之和。

第 17 题

{{ input(17) }} 如果 nn 是素数,那么 solve 的返回值总是 11。

第 18 题

{{ input(18) }} 当 n=496n=496 时,程序会输出 "perfect number"。

选择题

第 19 题

{{ select(19) }} nn 的取值区间为 [10,100][10,100] 时,第一个输出 "abundant number" 的 nn 是( )。

  • 10
  • 12
  • 28
  • 72

第 20 题

{{ select(20) }} nn 的取值区间为 [1,1000][1,1000] 时,关于完全数(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,则输出结果是 00。

第 22 题

{{ input(22) }} 本题输入 num 数组的数据可以是无序的。

第 23 题

{{ input(23) }} 程序功能是判断 nn 个数是不是连续的,如果不是连续的,则输出其中缺失的数。

选择题

第 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) }} 该程序使用二分查找,找到第一个大于或等于 xx 的元素的下标和数值。

第 27 题

{{ input(27) }} 当输入 7 8 0 9 2 7 8 7 6 时,程序输出为 "7 97\ 9"。

第 28 题

{{ input(28) }} 数组排序后,也可以使用 upper_bound(a,a+n,x)-a 得到 pp 的数值。

选择题

第 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 分) 对于输入的 nn 个数的序列,下列说法中正确的是( )。

  • 序列中的元素可以从大到小有序
  • 序列中的元素可以从小到大有序
  • 序列中的元素可以无序
  • 以上说法都正确

三、完善程序(单选题,每小题 33 分,共计 3030 分)

(1)(汉诺塔问题)有三根柱子 A、B、C,其中 A 柱上叠放有 nn 个大小不同的圆盘,按大小顺序从下到上排列(最大的在最下面,最小的在最上面)。目标是将所有圆盘从 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) }} ②处应填( )。

  • -1
  • 0
  • n
  • n + 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) }} ④处应填( )。

  • u
  • d[u]
  • k
  • d[k]

第 40 题

{{ select(40) }} ⑤处应填( )。

  • !ok[v] && cost < d[v]
  • !ok[v] && cost > d[v]
  • ok[v] && cost < d[v]
  • ok[v] && cost > d[v]