#CSPJSH15. 珅泽教育CSP-J第一轮模拟考第十五套

珅泽教育CSP-J第一轮模拟考第十五套

一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)

  1. 在 C++ 中,表达式 (-97 % 13) + 0b110101 - 0xCE 的值与下列哪个表达式的值不同( )。

{{ select(1) }}

  • (-97 % -13) + 0b110101 - 0xCE
  • (-6 % 7) + 0x35 - 0316
  • (-6 % 7) + 0b110101 - 0xCE
  • (-97 % 13) + 0b110101 - 0xCD
  1. 为了统计一个非负整数的二进制形式中 11 的个数,代码如下,则空格内应填入的语句是( )。
int count(int x)
{
    if (x == 0)
        return 0;
    else
        return 1 + count(_____);
}

{{ select(2) }}

  • x - 1
  • x & (x - 1)
  • x >> 1
  • x << 1
  1. 逻辑异或(\oplus)是一种二元运算,其真值表为 10=01=11\oplus0=0\oplus1=111=00=01\oplus1=0\oplus0=0。以下关于逻辑异或的性质,正确的是( )。

{{ select(3) }}

  • 支配律:a1=1a\oplus1=1
  • 结合律:(ab)c=a(bc)(a\oplus b)\oplus c=a\oplus(b\oplus c)
  • 关于逻辑与的分配律:a(bc)=(ab)(ac)a\oplus(b\land c)=(a\oplus b)\land(a\oplus c)
  • 关于逻辑或的分配律:a(bc)=(ab)(ac)a\oplus(b\lor c)=(a\oplus b)\lor(a\oplus c)
  1. 现有 5 样商品,每样数量为 1,重量分别为 6,5,4,3,76,5,4,3,7,对应价值分别为 12,11,9,7,1312,11,9,7,13。背包容量为 20,装入背包的物品能获得的最大总价值是( )。

{{ select(4) }}

  • 4343
  • 4141
  • 4040
  • 3838
  1. 从 5 个红球和 4 个白球中任取 3 个球,则至少有一个红球的取法数为( )。

{{ select(5) }}

  • 8484
  • 8080
  • 7575
  • 7070
  1. 已知 f[0]=1f[0]=1f[1]=2f[1]=2,并且对于所有 n2n\ge2f[n]=(2×f[n1]+f[n2])mod7f[n]=(2\times f[n-1]+f[n-2])\bmod7,那么 f[2026]f[2026] 的值是( )。

{{ select(6) }}

  • 00
  • 11
  • 22
  • 55
  1. 对图 GG 中各个结点分别指定一种颜色,使相邻结点颜色不同,则称为图 GG 的一个正常着色。正常着色图 GG 所必需的最少颜色数称为 GG 的色数。那么下图的色数是( )。

第7题图

{{ select(7) }}

  • 33
  • 44
  • 55
  • 66
  1. 在一个无向图中,如果任意两点之间都存在路径相连,则称其为连通图。下图是一个有 5 个顶点、8 条边的连通图。若要使它不再是连通图,至少要删去其中的( )条边。

第8题图

{{ select(8) }}

  • 22
  • 33
  • 44
  • 55
  1. 二叉树 TT 的广度优先遍历序列为 A、B、C、D、E、F、G、H、I,已知 A 是 C 的父结点,D 是 G 的父结点,F 是 I 的父结点,树中所有结点的最大深度为 3,根结点的深度为 0,可知 E 的父结点可能是( )。

{{ select(9) }}

  • A、B
  • B、C
  • A、B、F
  • B、C、E
  1. 已知字符集 a、b、c、d、e、f、g、h。若各字符的哈夫曼编码依次是 0100、10、0000、0101、001、011、11、0001,则编码序列 0100011001001011110101 的译码结果是( )。

{{ select(10) }}

  • acgabfh
  • adbagbb
  • afbeagd
  • afeefgd
  1. 已知网格上每个格子有一个数字,a[i][j] 表示第 ii 行第 jj 列格子上的数字。若 dp[i][j] 表示从网格左上角 (0,0)(0,0) 走到第 ii 行第 jj 列时能取得的最小数字和,且每次只能向右或向下移动。对于 i>0i>0j>0j>0 的位置,正确的状态转移代码为( )。

{{ select(11) }}

  • dp[i][j] = a[i][j] + min(dp[i-1][j], dp[i][j-1]);
  • dp[i][j] = a[i][j] + max(dp[i-1][j], dp[i][j-1]);
  • dp[i][j] = min(dp[i-1][j], dp[i][j-1]);
  • dp[i][j] = a[i][j] + dp[i-1][j-1];
  1. 给定正整数 N=9754832160N=9754832160,现需要删除其中 6 个数字。每次删除一个数字,并保证每次删除的都是当前状态下的最小数,则第四次应该删除的数字是( )。

{{ select(12) }}

  • 33
  • 44
  • 66
  • 88
  1. 已知 pint 类型,qint * 类型,下列不符合语法的是( )。

{{ select(13) }}

  • *q = p;
  • p = *q;
  • *(p + q) = p;
  • *(p + q) = q;
  1. 对于一棵二叉树,独立集是指两两互不相邻的结点构成的集合。例如,图1有5个不同的独立集(1个双点集合、3个单点集合、1个空集),图2有14个不同的独立集。那么,图3有( )个不同的独立集。

第14题图

{{ select(14) }}

  • 32803280
  • 55365536
  • 65606560
  • 68666866
  1. 下列关于无向连通图特性的叙述中,正确的是( )。

I. 所有顶点的度之和为偶数
II. 边数大于顶点个数
III. 至少有一个顶点的度为 1

{{ select(15) }}

  • 只有 I
  • 只有 II
  • I 和 II
  • I 和 III

二、阅读程序(判断题每题1分,选择题每题3分,共计40分;判断题正确填 T,错误填 F)

第1题

int solve(int n, int a[], int b[])
{
    std::sort(a, a + n);
    std::sort(b, b + n);

    int ans = std::abs(a[0] - b[0]);
    int i = 0, j = 0;

    while (i < n && j < n)
    {
        if (a[i] < b[j])
        {
            int diff = b[j] - a[i];
            if (ans > diff)
                ans = diff;
            i++;
        }
        else
        {
            int diff = a[i] - b[j];
            if (ans > diff)
                ans = diff;
            j++;
        }
    }
    return ans;
}
  1. 当存在一组 iijj 满足 a[i] = b[j] 时,程序返回 0( )。

{{ select(16) }}

  • 正确
  • 错误
  1. 当存在一组 iji\ne j 满足 a[i] = a[j] 时,程序返回 0( )。

{{ select(17) }}

  • 正确
  • 错误
  1. 当输入数据中出现负数时,程序可能返回负数( )。

{{ select(18) }}

  • 正确
  • 错误
  1. n=3n=3a=[5,1,12]b=[7,9,4] 时,程序返回( )。

{{ select(19) }}

  • 11
  • 22
  • 33
  • 44
  1. 程序返回的是( )。

{{ select(20) }}

  • 数组 a 中的元素与数组 b 中的元素之间的最大差值
  • 数组 a 中的元素与数组 b 中的元素之间的最小差值
  • 数组 a 的最大值与数组 b 的最小值之差
  • 数组 b 的最大值与数组 a 的最小值之差
  1. 程序的时间复杂度为( )。

{{ select(21) }}

  • Θ(n2)\Theta(n^2)
  • Θ(nlogn)\Theta(n\log n)
  • Θ(n)\Theta(n)
  • Θ(log2n)\Theta(\log^2 n)

二、阅读程序(判断题每题1分,选择题每题3分,共计40分;判断题正确填 T,错误填 F)

第2题

using i64 = long long;
i64 solve(i64 n)
{
    i64 c = 0;
    i64 p = 1;
    i64 t = 0;
    while (n > 0)
    {
        int d = n % 10;
        n /= 10;
        if (d > 0)
        {
            c += n * p;
        }
        else
        {
            c += (n - 1) * p;
            c += t + 1;
        }
        t += d * p;
        p *= 10;
    }
    return c;
}
  1. 运行过程中,tc 两个变量将会越来越大( )。

{{ select(22) }}

  • 正确
  • 错误
  1. 若将程序中所有的 10 改成 8,程序的返回值不会变大( )。

{{ select(23) }}

  • 正确
  • 错误
  1. 程序的时间复杂度是 Θ(logn)\Theta(\log n)( )。

{{ select(24) }}

  • 正确
  • 错误
  1. n=2026n=2026 时,程序返回( )。

{{ select(25) }}

  • 509509
  • 510510
  • 529529
  • 531531
  1. n=31415n=31415 时,程序返回( )。

{{ select(26) }}

  • 1237912379
  • 1238012380
  • 1238112381
  • 1238212382
  1. solve(n) 函数的功能是( )。

{{ select(27) }}

  • 统计 nn 的十进制表示中数字 0 的数量
  • 统计 1 到 nn 的所有正整数中“出现过 0 的整数数量”
  • 统计 1 到 nn 的所有正整数的十进制表示中数字 0 出现的总次数
  • 统计 1 到 nn 的所有正整数的十进制表示中数字 0 出现的总次数,并将位数短于 nn 的数在左侧补 0 后计入这些 0

二、阅读程序(判断题每题1分,选择题每题3分,共计40分;判断题正确填 T,错误填 F)

第3题

int A[1024];
int cache[1024];

int build(int begin, int end, int node)
{
    if (begin + 1 == end) {
        std::cin >> A[begin];
        return A[begin];
    }
    else {
        auto mid = (begin + end) / 2;
        auto lson = node * 2 + 1;
        auto rson = lson + 1;
        auto left = build(begin, mid, lson);
        auto right = build(mid, end, rson);
        if (left <= right) {
            cache[node] = true;
            return left;
        }
        else {
            cache[node] = false;
            return right;
        }
    }
}

void print(int begin, int end, int node) {
    if (begin + 1 == end) {
        std::cout << A[begin] << " ";
    }
    else {
        auto mid = (begin + end) / 2;
        auto lson = node * 2 + 1;
        auto rson = lson + 1;
        if (cache[node]) {
            print(begin, mid, lson);
            print(mid, end, rson);
        }
        else {
            print(mid, end, rson);
            print(begin, mid, lson);
        }
    }
}

void solve(int n)
{
    build(0, 1 << n, 0);
    print(0, 1 << n, 0);
}
  1. 输入 3 1 4 2 并调用 solve(2),输出为 1 3 2 4( )。

{{ select(28) }}

  • 正确
  • 错误
  1. 输入 0 1 2 3 4 5 6 7 并调用 solve(3),输入和输出完全相同( )。

{{ select(29) }}

  • 正确
  • 错误
  1. 输入 8 7 6 5 4 3 2 1 并调用 solve(3),输出与输入恰好相反( )。

{{ select(30) }}

  • 正确
  • 错误
  1. 输入是 1188 的任意一个排列时,调用 solve(3) 总会输出升序排列 1 2 3 4 5 6 7 8( )。

{{ select(31) }}

  • 正确
  • 错误
  1. 输入 3 1 4 1 5 9 2 6 并调用 solve(3),输出是( )。

{{ select(32) }}

  • 1 3 1 4 2 6 5 9
  • 3 1 4 1 5 9 2 6
  • 1 1 2 3 4 5 6 9
  • 6 2 9 5 1 4 1 3
  1. 调用 solve(n) 时,cache[] 数组中会被使用的下标范围是( )。

{{ select(33) }}

  • [0,2n)[0,2^n)
  • [0,2n][0,2^n]
  • [0,2n+1)[0,2^{n+1})
  • [0,2n+1][0,2^{n+1}]
  1. 调用 solve(n) 的时间复杂度为( )。

{{ select(34) }}

  • Θ(n)\Theta(n)
  • Θ(n2)\Theta(n^2)
  • Θ(2n)\Theta(2^n)
  • Θ(n2n)\Theta(n2^n)
  1. 输入 9 2 7 4 1 8 3 6 并调用 solve(3),输出是( )。

{{ select(35) }}

  • 2 9 4 7 1 8 3 6
  • 2 7 4 9 1 3 6 8
  • 1 8 3 6 2 9 4 7
  • 2 9 4 7 1 3 6 8

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

第1题

给定整数 NNAA 以及 MM,请计算并输出:

(1+A1+A2++AN1)modM(1+A^1+A^2+\cdots+A^{N-1})\bmod M
using i64 = long long;
std::pair<i64, i64> solve(i64 n, i64 A, i64 M)
{
    if (n == 0)
        return {____(1)____};
    else if (n % 2 == 1) {
        auto result = solve(____(2)____, A, M);
        auto sum = result.first;
        auto pow = result.second;
        sum = ____(3)____;
        pow = pow * A % M;
        return {sum, pow};
    }
    else {
        auto result = solve(____(4)____, A, M);
        auto sum = result.first;
        auto pow = result.second;
        sum = ____(5)____;
        pow = ____(6)____;
        return {sum, pow};
    }
}

int main()
{
    i64 N, A, M;
    std::cin >> N >> A >> M;
    std::cout << solve(N, A, M).first << "\n";
}
  1. (1)处应填( )。

{{ select(36) }}

  • 0, 0
  • 0, 1
  • 1, 0
  • 1, 1
  1. (2)(4)处应填( )。

{{ select(37) }}

  • n - 1, n - 1
  • n - 1, n / 2
  • n / 2, n - 1
  • n / 2, n / 2
  1. (3)处应填( )。

{{ select(38) }}

  • sum * A % M
  • pow * sum % M
  • (1 + sum * A) % M
  • (1 + pow) * sum % M
  1. (5)处应填( )。

{{ select(39) }}

  • sum * A % M
  • pow * sum % M
  • (1 + sum * A) % M
  • (1 + pow) * sum % M
  1. (6)处应填( )。

{{ select(40) }}

  • sum * A % M
  • pow * A % M
  • pow * sum % M
  • pow * pow % M

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

第2题

给定一个 n×nn\times n 的网格。第 i+1i+1 行、第 j+1j+1 列的格子(0i,j<n0\le i,j<n)记作 (i,j)(i,j)。格子 (i,j)(i,j) 的颜色由字符 p[imodn][jmodn]p[i\bmod n][j\bmod n] 决定,如果是 B,则 (i,j)(i,j) 是黑格;如果是 W,则是白格。

给定 qq 个查询,请依次处理。每个查询给出 4 个整数 A,B,C,DA,B,C,D,求出以 (A,B)(A,B) 为左上角、(C,D)(C,D) 为右下角的矩形区域内包含的黑格数量。

#include<iostream>
int n, q;
int s[1001][1001];
long long sum(int row, int col) {
    long long a = 1LL * ____(1)____ ;
    long long b = 1LL * (row/n) * s[n][col%n];
    long long c = 1LL * (col/n) * s[row%n][n];
    long long d = 1LL * ____(2)____ ;
    return ____(3)____ ;
}
int main() {
    std::cin >> n >> q;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j) {
            char c;
            std::cin >> c;
            ____(4)____ ;
        }
    while (q-->0) {
        int x1, x2, y1, y2;
        std::cin >> x1 >> y1 >> x2 >> y2;
        std::cout << ____(5)____ << "\n";
    }
}
  1. (1)处应填( )。

{{ select(41) }}

  • row * col
  • (row/n) * (col/n) * s[n][n]
  • row * col * s[row%n][col%n]
  • (row/n) * (col/n) * s[row%n][col%n]
  1. (2)处应填( )。

{{ select(42) }}

  • s[n][n]
  • s[row][col]
  • s[row-1][col-1]
  • s[row%n][col%n]
  1. (3)处应填( )。

{{ select(43) }}

  • a + b + c + d
  • a + b + c - d
  • a - b - c + d
  • a - b - c - d
  1. (4)处应填( )。

{{ select(44) }}

  • s[i][j] = s[i][j-1] + s[i-1][j] - s[i-1][j-1] + (c == 'B')
  • s[i][j] = s[i][j-1] + s[i-1][j] + s[i-1][j-1] + (c == 'W')
  • s[i+1][j+1] = s[i+1][j] + s[i][j+1] - s[i][j] + (c == 'B')
  • s[i+1][j+1] = s[i+1][j] + s[i][j+1] + s[i][j] + (c == 'W')
  1. (5)处应填( )。

{{ select(45) }}

  • sum(x2, y2) - sum(x2, y1 - 1) - sum(x1 - 1, y2) + sum(x1 - 1, y1 - 1)
  • sum(x2, y2) - sum(x2, y1 + 1) - sum(x1, y2 + 1) + sum(x1 - 1, y1 - 1)
  • sum(x2 - 1, y2 - 1) - sum(x2 - 1, y1) - sum(x1, y2 - 1) + sum(x1, y1)
  • sum(x2 + 1, y2 + 1) - sum(x2 + 1, y1) - sum(x1, y2 + 1) + sum(x1, y1)