#CSP0018. CSP-S 2026 初赛模拟试卷 二

CSP-S 2026 初赛模拟试卷 二


  1. 大多数计算机病毒主要造成计算机()的损坏。 {{ select(1) }}
  • 软件和数据
  • 硬件和数据
  • 硬件、软件和数据
  • 硬件和软件

  1. 假设有253块月饼,把它们装到15个盒子里面,那么数量最多的一盒至少装()块月饼。 {{ select(2) }}
  • 16
  • 23
  • 15
  • 17

  1. ASCII码是由美国国家标准委员会指定的一种包括数字、字母、通用字符和控制符号在内的字符编码集,它是一种()位二进制码。 {{ select(3) }}
  • 8
  • 7
  • 4
  • 32

  1. 计算机的硬件主要包括控制器、()存储器、输入设备、输出设备。 {{ select(4) }}
  • 运算器
  • 操作系统
  • 计算机语言
  • 磁盘

  1. 字符'a'的ASCII码是97,下面程序的输出结果是()。
char c = 'a' + 4;
cout << (int)c << ' ' << c + 3 << endl;

{{ select(5) }}

  • e, h
  • 101, 104
  • e, 104
  • 101, h

  1. 操作系统是对()进行管理的软件。 {{ select(6) }}
  • 计算机资源
  • 软件
  • 硬件
  • 应用程序

  1. 以下选项中,()不是操作系统。 {{ select(7) }}
  • Linux
  • Windows CE
  • Solaris
  • Celeron

  1. 以下关于 C++\mathrm{C++} 语言注释的说法中正确的是()。 {{ select(8) }}
  • C++\mathrm{C++} 程序时必须书写注释,否则会对程序的功能造成影响
  • C++\mathrm{C++} 语言的注释将参与编译器编译,并形成指令
  • 可以采用“/\\/”的形式书写多行注释,其中的注释内容可以是任何字符
  • “//注释”表示从//开始直到本行末尾的所有字符均是注释内容

  1. 要使用putchar函数实现向显示器输出字符'A',可使用()。 {{ select(9) }}
  • putchar(65)
  • putchar(A)
  • putchar('\65')
  • putchar("A")

  1. 两个指针类型变量()。 {{ select(10) }}
  • 可在一定条件下相加
  • 如同时指向一个变量,则此后就不能再指向其他变量了
  • 任何时候都不能相减
  • 可在一定条件下进行相等或不平等的比较运算

  1. 下列属于B类IP地址的是()。 {{ select(11) }}
  • 27.33.119.2
  • 134.300.12.4
  • 133.201.189.32
  • 192.97.32.121

  1. 现有变量 a,b,c,da,b,c,d,取值范围均为 [0,15][0,15],假设每个值出现的概率相同,则 abcda \sim b \sim c \sim d 的值能被3整除的概率是( )。(这里 \sim 为按位异或运算符。) {{ select(12) }}
  • 3/8
  • 1/2
  • 1/4
  • 1/8

  1. 假设以S和X分别表示进栈和出栈操作,对输入序列a,b,c,d,e进行一系列栈操作 SSXSXSSXXX 之后,得到的输出序列为( )。 {{ select(13) }}
  • baced
  • bceda
  • cbaed
  • edcba

  1. 某递归算法的执行时间的递推关系如下:当 n=1n = 1T(n)=1T(n) = 1,当 n>1n > 1T(n)=2T(n/2)+1T(n) = 2T(n/2) + 1。则该算法的时间复杂度为( )。 {{ select(14) }}
  • O(1)O(1)
  • O(log2n)O(\log_2 n)
  • O(n)O(n)
  • O(nlog2n)O(n\log_2 n)

  1. 一棵完全二叉树中有501个叶节点,则整棵树至少有( )个节点。 {{ select(15) }}
  • 501
  • 502
  • 1001
  • 1002

阅读程序(1):

#include <iostream>
using namespace std;
const int maxn = 100001;

int N,M,K,x[maxn],y[maxn],d[maxn],c[maxn];
int *a[maxn];

int main() {
    cin >> N >> M >> K;
    for (int i=0; i<K; ++i) {
        //表示第x[i]行第y[i]列值为d[i]
        cin >> x[i] >> y[i] >> d[i];
        c[y[i]]++;
    }
    for (int i=1; i<=M; ++i) a[i] = new int[c[i]];
    for (int i=0; i<K; ++i) {
        *a[y[i]] = d[i];
        a[y[i]]++;
    }
    for (int i=1; i<=M; ++i) {
        a[i] = a[i] - c[i];
        for (int j=0; j<c[i]; ++j, ++a[i])
            cout << *a[i] << " ";
    }
    return 0;
}
  1. 程序定义了一个指针数组a,a[i]表示第i列的指针。 {{ select(16) }}
  • 正确
  • 错误

  1. *a[y[i]] = d[i] 改成 a[y[i]][0] = d[i] 不影响运算结果。 {{ select(17) }}
  • 正确
  • 错误

  1. 第12行中,数组c用来统计每行中的数据个数。 {{ select(18) }}
  • 正确
  • 错误

  1. 在本程序中,采用动态数组以优化空间的利用,每一列数组长度可能不同。 {{ select(19) }}
  • 正确
  • 错误

  1. 该程序的时间复杂度为( )。 {{ select(20) }}
  • O(MN)O(MN)
  • O(M+K)O(M+K)
  • O(M+N)O(M+N)
  • O(K)O(K)

  1. 该程序的空间复杂度为( )。 {{ select(21) }}
  • O(M+K)O(M+K)
  • O(NK)O(NK)
  • O(M+N)O(M+N)
  • O(MN)O(MN)

阅读程序(2):

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

int m[101][101];

int main() {
    int a;
    cin >> a;
    int c = a * a, i = 1, k = (a+1)/2;
    for (int j=1; j<=c; j++) {
        m[i][k] = j;
        if (j % a == 0) {
            if (i == a) i = 1; else i++;
        } else {
            if (i == 1) i = a; else i--;
            if (k == a) k = 1; else k++;
        }
    }
    for (int i=1; i<=a; i++) {
        for (int j=1; j<=a; j++)
            cout << setw(5) << m[i][j];
        cout << endl;
    }
    return 0;
}
  1. 从程序可以看出,i 为被填数,j 和 k 为填数位置。 {{ select(22) }}
  • 正确
  • 错误

  1. 填数结束后,数组 m 中的元素互不相同。 {{ select(23) }}
  • 正确
  • 错误

  1. j % a == 0i != a 时,下一步填入的是( )。 {{ select(24) }}
  • m[i][k]
  • m[i+1][k]
  • m[k+1][i]
  • m[k+1][i+1]

  1. j % a != 0i != 1k == a 时,下一步填入的是( )。 {{ select(25) }}
  • m[a][i]
  • m[i-1][i]
  • m[a][k+1]
  • m[i-1][k+1]

  1. (4 分)填数后,每行每列及对角线的和均为( )。 {{ select(26) }}
  • (a2+1)a/2(a^2+1)a/2
  • (a2+1)/2(a^2+1)/2
  • (a2+1)a(a^2+1)a
  • a2+1a^2+1

阅读程序(3):

#include <iostream>
using namespace std;

int a[101], d[101];

int main() {
    int n = 5;
    a[1] = d[1] = 1;
    for (int i=1; i<=n; ++i) {
        int s = i+1, x = 0;
        for (int j=1; j<=n+1-i; ++j) {
            int k = s + x;
            x++;
            a[j+1] = a[j] + k;
            cout << a[j] << ' ';
        }
        cout << "..." << endl;
        a[i] = d[i+1] = d[i] + i;
    }
    return 0;
}
  1. 该题由两重循环构成,外循环 i 控制列的变化,内循环 j 控制行的变化。 {{ select(27) }}
  • 正确
  • 错误

  1. 代码运行结果如下。
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

{{ select(28) }}

  • 正确
  • 错误

  1. (4分)程序在输出时,第i行为()个 a[j] 数组的值。 {{ select(29) }}
  • n+1in+1-i
  • n+1n+1
  • n+1+in+1+i
  • nn

  1. (4分)本题代码的运算结果是输出()行。 {{ select(30) }}
  • 4
  • 5
  • 6
  • 7

完善程序(1):

#include <cstdio>
#include <memory>
#include <cmath>
#define LEN 125

void Multiply(int *a, int *b) {
    int i, j, nCarry, nTmp, c[LEN];
    memset(c, 0, sizeof(int) * LEN);
    for (i = 0; i < LEN; i++) {
        nCarry = 0;
        for (j = 0; ①; j++) {
            nTmp = c[i + j] + a[j] * b[i] + nCarry;
            c[i + j] = nTmp % 10000;
            nCarry = nTmp / 10000;
        }
    }
    memcpy(a, c, LEN * sizeof(int));
}

int main() {
    int i, p, anPow[LEN], aResult[LEN];
    scanf("%d", &p);
    printf("%d\n", (int)(p * log10(2)) + 1);
    anPow[0] = 2;
    aResult[0] = 1;
    for (i = 1; i < LEN; i++) {
        anPow[i] = 0;
        aResult[i] = 0;
    }
    while (②) {
        if (③) {
            Multiply(aResult, anPow);
        }
        p >>= 1;
        Multiply(anPow, anPow);
    }
    aResult[0]--;
    for (i = LEN - 1; i >= 0; i--) {
        if (④)
            printf("%02d\n%02d", aResult[i] / 100, aResult[i] % 100);
        else {
            printf("%04d", aResult[i]);
            if (i % 25 == 0) printf("\n");
        }
    }
    return 0;
}
  1. ①处应填( )。 {{ select(31) }}
  • j < LEN
  • j < LEN - i - 1
  • i < LEN - i
  • j < 1

  1. ②处应填( )。 {{ select(32) }}
  • p > 0
  • p == 0
  • p < 0
  • p >= 0

  1. ③处应填( )。 {{ select(33) }}
  • p & 1
  • p
  • p || 1
  • p = 0

  1. ④处应填( )。 {{ select(34) }}
  • i != 0
  • i > 0
  • i % 10 == 0
  • i % 25 == 12

完善程序(2):

#include <cstdio>
#include <cstdlib>
#include <memory>
#include <algorithm>

int f[30][1000], Path[300][1000];
int P[300], D[300], Answer[30];

int main() {
    int i, j, k, t1, t2, n, m, nMinPD;
    int nCaseNo = 0;
    scanf("%d%d", &n, &m);
    while (n + m) {
        nCaseNo++;
        for (i = 1; i <= n; i++) scanf("%d%d", &P[i], &D[i]);
        memset(f, -1, sizeof(f));
        memset(Path, 0, sizeof(Path));
        nMinPD = ①;
        ②;
        for (j = 0; j < m; j++) {
            for (k = 0; ③; k++)
                if (④) {
                    for (i = 1; i <= n; i++)
                        if (⑤) {
                            t1 = j; t2 = k;
                            while (t1 > 0 && Path[t1][t2] != i) {
                                t2 = P[Path[t1][t2]] - D[Path[t1][t2]];
                                t1--;
                            }
                            if (t1 == 0) {
                                f[j+1][k + P[i] - D[i]] = f[j][k] + P[i] + D[i];
                                Path[j+1][k + P[i] - D[i]] = i;
                            }
                        }
                }
        }
        i = nMinPD; j = 0;
        while (f[m][i+j] < 0 && f[m][i-j] < 0) j++;
        if (f[m][i+j] > f[m][i-j]) k = i + j;
        else k = i - j;
        printf("Jury_#_%d\n", nCaseNo);
        printf("Best_jury_has_value_%d_for_prosecution_and_value_%d_for_defence:\n",
               (k - nMinPD + f[m][k]) / 2,
               (f[m][k] - k + nMinPD) / 2);
        for (i = 1; i <= m; i++) {
            ⑥;
            k = P[Answer[j]] - D[Answer[j]];
        }
        std::sort(Answer + 1, Answer + m + 1);
        for (i = 1; i <= m; i++) printf("%d", Answer[i]);
        printf("\n\n");
        scanf("%d%d", &n, &m);
    }
    return 0;
}
  1. ①处应填( )。 {{ select(35) }}
  • nMinPD = m * 20
  • nMinPD = m
  • nMinPD = m * 200
  • nMinPD = m * n

  1. ②处应填( )。 {{ select(36) }}
  • f[0][nMinPD] = 1
  • f[0][nMinPD] = 0
  • f[0][nMinPD] > 0
  • f[0][nMinPD] > 1

  1. ③处应填( )。 {{ select(37) }}
  • k < nMinPD * 2
  • k < nMinPD
  • k <= nMinPD * 2
  • k <= nMinPD

  1. ④处应填( )。 {{ select(38) }}
  • f[j][k] > 1
  • f[j][k] >= 1
  • f[j][k] >= 0
  • f[j][k] > 0

  1. ⑤处应填( )。 {{ select(39) }}
  • f[j][k] + P[i] + D[i] > f[j+1][k+P[i]-D[i]]
  • f[j][k] + P[i] + D[i] > f[j+1][k+P[i]]
  • f[j][k] + P[i] > f[j+1][k+P[i]]
  • f[j][k] + P[i] > f[j+1][k+P[i]-D[i]]

  1. ⑥处应填( )。 {{ select(40) }}
  • Answer[j] = Path[m-j][k]
  • Answer[j] = Path[m-j][k+1]
  • Answer[j] = Path[m-j+1][k+1]
  • Answer[j] = Path[m-j+1][k]