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

  • 110011
  • 110000
  • 110010
  • 110001

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

  • 2560
  • 640
  • 320
  • 160

第 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 分)

阅读下列程序。判断题请选择 TF,其他题请选择 ABCD

程序 1:数组循环左移(第 16~21 题)

输入满足 n ≥ 1k ≥ 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 4
  • 3 4 5 1 2
  • 2 3 4 5 1
  • 4 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) }}

  • 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 0
  • q.pop()
  • d[0][0]=-1
  • q.push({0,0})

第 35 题(3 分)

空(2)应填入( )。

{{ select(35) }}

  • !q.empty()
  • q.empty()
  • d[0][0]==-1
  • n--

第 36 题(3 分)

空(3)应填入( )。

{{ select(36) }}

  • d[nx][ny]==-1
  • g[x][y]==0
  • nx==ny
  • d[nx][ny]!=-1

第 37 题(3 分)

空(4)应填入( )。

{{ select(37) }}

  • 0
  • d[nx][ny]+1
  • 1
  • d[x][y]+1

第 38 题(3 分)

空(5)应填入( )。

{{ select(38) }}

  • q.size()
  • d[n-1][m-1]
  • n+m
  • d[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==n
  • j==m
  • i<n||j<m
  • i<n&&j<m

第 40 题(3 分)

空(2)应填入( )。

{{ select(40) }}

  • i<j
  • a[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 x
  • cin>>x
  • cout<<x<<' '