#CSP0011. CSP-J 2026 初赛模拟试卷 五

CSP-J 2026 初赛模拟试卷 五

  1. 以下关于存储器的说法中,错误的是( {{ select(1) }}
  • RAM中的信息在断电后会丢失
  • CPU可以直接从硬盘中读取指令并执行
  • 内存的访问速度通常比外存快
  • ROM是一种只读存储器

  1. 对于变量 a=7a = 7b=4b = 4,表达式 (ab)&((a)b)(a \sim b) \& ((\sim a) \mid b) 的结果是()。 {{ select(2) }}
  • 3
  • 4
  • 7
  • 0

  1. 一个8位有符号整数采用二进制补码表示,其可以表示的最小十进制数是()。 {{ select(3) }}
  • -127
  • -128
  • -255
  • -256

  1. 在NOI Linux终端中,要创建一个名为“test”的新目录,应该使用()命令。 {{ select(4) }}
  • new test
  • create test
  • mkdir test
  • md test

  1. xx 是正整数且在int范围内,则表达式 (x&(x1))==0(x \& (x-1)) == 0 可以用来判断一个无符号整数 xx()。 {{ select(5) }}
  • 是偶数
  • 是2的幂次
  • 是0
  • 是奇数

  1. 在平均情况下,( )算法的时间复杂度最低。 {{ select(6) }}
  • 冒泡排序
  • 插入排序
  • 快速排序
  • 选择排序

  1. 以下代码的空间复杂度是()。
int sum = 0;
for (int i = 0; i < n; i++) {
    int temp = i * 2;
    sum += temp;
}

{{ select(7) }}

  • O(1)O(1)
  • O(n)O(n)
  • O(n2)O(n^2)
  • O(logn)O(\log n)

  1. 一个项目团队有12名成员,团队内部任意两人都有过合作经历。这样的合作关系对应()。 {{ select(8) }}
  • 连通图
  • 完全图
  • 二分图
  • 稀疏图

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

  1. 5个男生和3个女生站成一排,要求女生不相邻,且第一个和最后一个位置必须是男生,不同的排法有()种。 {{ select(10) }}
  • 2880
  • 4320
  • 720
  • 1440

  1. 已知二叉树的中序遍历序列为DBEAC,后序遍历序列为DEBCA,则前序遍历序列为()。 {{ select(11) }}
  • ABCDE
  • ABDEC
  • ABEDC
  • ABECD

  1. 用数组存储完全二叉树,按从上到下、从左到右的顺序编号(从1开始),则节点 ii 的左子节点是()。 {{ select(12) }}
  • 2i2i
  • 2i+12i+1
  • i/2i/2
  • (i+1)/2(i+1)/2

  1. 以下关于CPU(中央处理器)的描述中,正确的是()。 {{ select(13) }}
  • CPU主要由存储器和控制器组成
  • CPU的性能仅由主频决定
  • 多核CPU是指一个CPU中有多个运算器
  • CPU是计算机的“大脑”,负责所有的运算和控制

  1. 学校有 nn 门课程,部分课程有先修关系(必须先修A才能修B)。现要判断课程安排是否合理,有没有循环依赖。这对应图论中的()问题。 {{ select(14) }}
  • 最短路径
  • 拓扑排序
  • 最小生成树
  • 负环

  1. 某哈夫曼树有8个叶节点,该树总共有()个节点。 {{ select(15) }}
  • 8
  • 15
  • 16
  • 17

阅读程序(1):

#include <iostream>
using namespace std;

int process(int n) {
    if (n == 0) return 0;
    return n % 2 + process(n / 2) * 10;
}

int main() {
    int num;
    cin >> num;
    int result = process(num);
    cout << result << endl;
    return 0;
}
  1. 输入10时,输出为1010。 {{ select(16) }}
  • 正确
  • 错误

  1. 输入1024时,输出为10000000000。 {{ select(17) }}
  • 正确
  • 错误

  1. 对于任意正整数n,process(n)的输出总是一个由0和1组成的数。 {{ select(18) }}
  • 正确
  • 错误

  1. (2分)若输入2025,则函数process被递归调用()次(包括第一次调用)。 {{ select(19) }}
  • 10
  • 11
  • 12
  • 13

  1. (2分)函数process的时间复杂度是()。 {{ select(20) }}
  • O(1)O(1)
  • O(n)O(n)
  • O(logn)O(\log n)
  • O(2n)O(2^n)

  1. 程序能正常处理的最大输入值为()。 {{ select(21) }}
  • 1023
  • 1024
  • 1000000000
  • 23112^{31}-1

阅读程序(2):

#include <iostream>
#include <cmath>
#define MAX 100
using namespace std;
int digits[MAX+9];

void solve(int a, int b, int precision) {
    if (b == 0) {
        cout << "Error::Division_by_zero!" << endl;
        return;
    }
    if (precision > MAX) precision = MAX;
    if (precision < 0) precision = 0;

    bool negative = (a < 0 && b > 0) || (a > 0 && b < 0);
    a = abs(a);
    b = abs(b);
    digits[0] = a / b;
    int remainder = a % b;

    for (int i = 1; i <= precision + 1; i++) {
        remainder *= 10;
        digits[i] = remainder / b;
        remainder %= b;
    }

    if (digits[precision + 1] >= 5) {
        digits[precision]++;
        for (int i = precision; i >= 1; i--) {
            if (digits[i] >= 10) {
                digits[i] -= 10;
                digits[i - 1]++;
            } else {
                break;
            }
        }
    }

    if (negative) cout << " - ";
    cout << digits[0] << '.';
    for (int i = 1; i <= precision; i++) {
        cout << digits[i];
    }
    cout << endl;
}

int main() {
    int a, b, prec;
    cin >> a >> b >> prec;
    solve(a, b, prec);
    return 0;
}
// 所有输入数据的绝对值均小于1000
  1. 程序输出结果保留指定的小数位数,同时实现四舍五入,小数位的数量等于输入变量prec的值。 {{ select(22) }}
  • 正确
  • 错误

  1. 若输入2025 25 0,程序会输出81。 {{ select(23) }}
  • 正确
  • 错误

  1. 若将程序中的solve(a,b,prec);替换成cout<<fixed<<setprecision(prec)<<(1.0*a/b)<<endl;,其他部分不变,则当prec的输入值在[0,15]区间时,输出结果是一样的。 {{ select(24) }}
  • 正确
  • 错误

  1. 如果输入2026 26 4,则输出的结果是()。 {{ select(25) }}
  • 77.923
  • 77.9230
  • 77.9231
  • 77.9232

  1. 如果输入的数据为2026 0 -6,下列说法中正确的是()。 {{ select(26) }}
  • 程序会因为执行除以0的操作而出错,不能正常输出数据
  • 程序不会报错,但不会输出具体数值,而是输出自定义的出错提示语
  • 程序不会报错,可以正常输出结果,输出结果为2026.
  • 程序不会报错,可以正常输出结果,输出结果为2026

阅读程序(3):

#include <iostream>
#include <vector>
using namespace std;

int bSearch(vector<int>& a, int target) {
    int left = 0, right = a.size() - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (a[mid] == target) {
            return mid;
        } else if (a[mid] > target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

int main() {
    int n, x;
    cin >> n >> x;

    vector<int> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    int ans = bSearch(a, x);
    cout << (ans != -1 ? ans : -1) << endl;
    return 0;
}
  1. 如果输入6 3 10 9 8 6 5 4,程序会输出-1。 {{ select(27) }}
  • 正确
  • 错误

  1. 该程序使用二分法,在单调不升数组中查找某个数在整个数组中排在第几个位置。 {{ select(28) }}
  • 正确
  • 错误

  1. 要保证正常查找功能,输入必须从大到小排列,并且数值要连续。 {{ select(29) }}
  • 正确
  • 错误

  1. 如果输入10 4 20 17 15 11 10 9 8 6 5 3,程序会输出()。 {{ select(30) }}
  • 11
  • 10
  • 8
  • -1

  1. 如果输入单调不升数组,被查找的数值出现过多次,则程序输出是()。 {{ select(31) }}
  • 匹配的最小的下标
  • 匹配的最大的下标
  • 随机
  • 无法确定

  1. 如果输入4 4 4 4 4 4,程序会输出()。 {{ select(32) }}
  • 0
  • 1
  • 2
  • 3

完善程序(1):

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int solve(vector<int>& nums, int k) {
    int n = ①;
    vector<vector<int>> dp(②);

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= k; j++) {
            if (j == 1) {
                dp[i][j] = max(③);
            } else {
                dp[i][j] = max(dp[i-1][j], ④);
            }
        }
    }
    return ⑤;
}

int main() {
    int n, k;
    cin >> n >> k;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) cin >> nums[i];
    cout << solve(nums, k) << endl;
    return 0;
}
  1. ①处应填()。 {{ select(33) }}
  • nums.size()-1
  • nums.size()
  • nums.length()-1
  • nums.length()

  1. ②处应填()。 {{ select(34) }}
  • n, vector(k, 0)
  • n, vector(k+1, 0)
  • n+1, vector(k, 0)
  • n+1, vector(k+1, 0)

  1. ③处应填()。 {{ select(35) }}
  • dp[i-1][j], nums[i-1]
  • dp[i][j], nums[i-1]
  • dp[i-1][j-1] + nums[i-1]
  • dp[i][j] + nums[i-1]

  1. ④处应填()。 {{ select(36) }}
  • dp[i-1][j], nums[i-1]
  • dp[i][j], nums[i-1]
  • dp[i-2][j-1] + nums[i-1]
  • dp[i][j] + nums[i-1]

  1. ⑤处应填()。 {{ select(37) }}
  • dp[n-1][k-1]
  • dp[n][k-1]
  • dp[n-1][k]
  • dp[n][k]

完善程序(2):

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100005;

struct Interval { int s, e; } ivl[N];
bool cmp(Interval a, Interval b) {
    return a.s < b.s || (①);
}

int main() {
    int L, n;
    cin >> L >> n;

    for (int i = 0; i < n; i++) {
        cin >> ivl[i].s >> ivl[i].e;
    }
    ②

    int curr = 0;
    int cnt = 0;
    int i = 0;

    while (curr < L) {
        int mx_reach = curr;
        while (③) {
            if (ivl[i].e > mx_reach) {
                mx_reach = ivl[i].e;
            }
            i++;
        }

        if (④) {
            cout << -1 << endl;
            return 0;
        }
        cnt++;
        ⑤
    }

    cout << cnt << endl;
    return 0;
}
  1. ①处应填()。 {{ select(38) }}
  • a.s == b.s && a.e < b.e
  • a.s == b.s && a.e <= b.e
  • a.s == b.s && a.e != b.e
  • a.s == b.s && a.e >= b.e

  1. ②处应填()。 {{ select(39) }}
  • sort(ivl, ivl + n);
  • sort(ivl, ivl + n, cmp);
  • sort(ivl + 1, ivl + 1 + n);
  • sort(ivl + 1, ivl + 1 + n, cmp);

  1. ③处应填()。 {{ select(40) }}
  • i < n && ivl[i].s > curr
  • i < n && ivl[i].s >= curr
  • i < n && ivl[i].s <= curr
  • i < n && ivl[i].s < curr

  1. ④处应填()。 {{ select(41) }}
  • i < n
  • i > n
  • mx_reach < curr
  • mx_reach == curr

  1. ⑤处应填()。 {{ select(42) }}
  • curr = mx_reach;
  • curr += mx_reach;
  • curr = intervals[i].e;
  • curr += intervals[i].e - intervals[i].s + 1;