信奥刷题站
CSP-S 初赛2022-09

2022年 CSP-S 第一轮(提高级)

题量
43 题
客观题
43 题
建议时长
120 分钟
卷面总分
100 分
开始整卷模拟计时作答 · 交卷即时判分 · 错题自动进错题本(需登录)

// questions

题目预览

单项选择题
1
单选题2

在 Linux 系统终端中,用于切换工作目录的命令为( )。

A

ls

B

cp

C

all

D

cd

2
单选题2

你同时用 time 命令和秒表为某个程序在单核 CPU 的运行计时。假如 time 命令的输出如下:

real 0m30.721s 
user 0m24.579s 
sys 0m6.123s

以下最接近秒表计时的时长为( )。

A

18s

B

6s

C

24s

D

30s

3
单选题2

若元素 aaabbbcccdddeeefff 依次进栈,允许进栈、退栈操作交替进行,但不允许连续三次退栈操作,则不可能得到的出栈序列是( )。

A

dcebfa

B

cbdaef

C

bcaefd

D

afedcb

4
单选题2

考虑对 nnn 个数进行排序,以下最坏时间复杂度低于 O(n2)\mathcal{O}(n^{2})O(n2)的排序方法是( )

A

插入排序

B

快速排序

C

冒泡排序

D

归并排序

5
单选题2

假设在基数排序过程中,受宇宙射线的影响,某项数据异变为一个完全不同的值。请问排序算法结束后,可能出现的最坏情况是( )。

A

移除受影响的数据后,最终序列是前后两个有序的子序列

B

移除受影响的数据后,最终序列是一个有序的子序列和一个基本无序的子序列

C

移除受影响的数据后,最终序列基本无序

D

移除受影响的数据后,最终序列是有序序列

6
单选题2

计算机系统用小端(Little Endian)和大端(Big Endian)来描述多字节数据的存储地址顺序模式,其中小端表示将低位字节数据存储在低地址的模式、大端表示将高位字节数据存储在低地址的模式。在小端模式的系统和大端模式的系统分别编译和运行以下 C++代码段表示的程序,将分别输出什么结果?( )

unsigned x = 0xDEADNEEF;
unsigned char *p = (unsigned char *)&x;
printf("%X", *p);
A

DEEF

B

DEDE

C

EFEF

D

EFDE

7
单选题2

一个深度为 555(根结点深度为 111)的完全 3 叉树,按前序遍历的顺序给结点从 111 开始编号,则第 100 号结点的父结点是第( )号

A

95

B

98

C

96

D

97

8
单选题2

强连通图的性质不包括( ):

A

每个顶点的度数至少为 1

B

每个顶点至少都连有一条边

C

任意两个顶点之间都有路径相连

D

任意两个顶点之间都有边相连

9
单选题2

每个顶点度数均为 222 的无向图称为“222-正规图”。由编号为从 111nnn 的顶点构成的所有 222-正规图,其中包含欧拉回路的不同 222-正规图的数量为( )。

A

(n−1)!(n-1)!(n1)!

B

n!2\frac{n!}{2}2n!

C

n!n!n!

D

(n−1)!2\frac{(n-1)!}{2}2(n1)!

10
单选题2

共有 888 人选修了程序设计课程,期末大作业要求由 222 人组成的团队完成。假设不区分每个团队内 222 人的角色和作用,请问共有多少种可能的组队方案。( )

A

323232

B

565656

C

646464

D

282828

11
单选题2

小明希望选到形如“省 A ·LLDDD\mathscr{LL}\mathcal{DDD}LLDDD”的车牌号。车牌号在“ ·”之前的内容固定不变; 后面 的 555 位号码中, 前 222 位必须是大写英文字母, 后 333 位必须是阿拉伯数字(L\mathscr{L}L代表 A 至 Z,D\mathcal{D}D 表示 0 至 9,两个L\mathscr{L}L和三个D\mathcal{D}D之间可能相同也可能不同)。请问总共有多少个可供选择的车牌号。( )

A

202802028020280

B

520005200052000

C

175760017576001757600

D

676000676000676000

12
单选题2

给定地址区间为 000~999 的哈希表,哈希函数为 h(x)=xh(x) = xh(x)=x % 101010,采用线性探查的冲突解决策略(对于出现冲突情况,会往后探查第一个空的地址存储;若地址 999 冲突了则从地址 000 重新开始探查)。哈希表初始为空表,依次存储(71,23,73,99,44,79,8971, 23, 73, 99, 44, 79, 8971,23,73,99,44,79,89)后,请问 898989 存储在哈希表哪个地址中。( )

A

000

B

111

C

999

D

222

13
单选题2

对于给定的 n,分析以下代码段对应的时间复杂度,其中最为准确的时间复杂度为( )。

int i, j, k = 0; 
for (i = 0; i < n; i++) { 
for (j = 0; j < n; j*=2) { 
k = k + n / 2; 
 } 
}
A

O(n)

B

O(n√n)

C

O(n2)\mathcal{O}(n^{2})O(n2)

D

O(n log n)

14
单选题2

以比较为基本运算,在 nnn 个数的数组中找最大的数,在最坏情况下至少要做( )次运算。

A

n2\frac{n}{2}2n

B

nnn

C

n+1n+1n+1

D

n−1n-1n1

15
单选题2

ack 函数在输入参数“(2, 2)”时的返回值为( )。

unsigned ack(unsigned m, unsigned n) { 
  if (m == 0) return n + 1; 
  if (n == 0) return ack(m - 1, 1); 
  return ack(m - 1, ack(m, n - 1)); 
}
A

5

B

9

C

13

D

7

阅读程序
16
判断题1
阅读程序代码(共 16-21 题共用)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int f(const string &s, const string &t) {
    int n = s.length(), m = t.length(); 
    vector<int> shift(128, m + 1);
    int i, j; 
    for (j = 0; j < m; j++)
       shift[t[j]] = m - j; 
    for (i = 0; i <= n - m; i += shift[s[i + m]]) {
       j = 0;
       while (j < m && s[i + j] == t[j]) j++;
          if (j == m) return i; 
    }
    return -1;
}
int main() {
   string a, b;
   cin >> a >> b;
   cout << f(a, b) << endl;
   return 0;
}

假设输入字符串由 ASCII 可见字符组成,当输入为“abcde fg”时,输出为 -1。(  )

A

错误

B

正确

17
判断题1
A

正确

B

错误

18
判断题1

当输入为“GoodLuckCsp2022 22”时,第 20 行的“j++”语句执行次数为 222。( )

A

错误

B

正确

19
单选题3

该算法最坏情况下的时间复杂度为(  )。

A

O(n +m)\mathcal{O}(n + m)O(n +m)

B

O(mlog⁡n)\mathcal{O}(m\log{n})O(mlogn)

C

O(nlog⁡m)\mathcal{O}(n\log{m})O(nlogm)

D

O(nm)\mathcal{O}(nm)O(nm)

20
单选题3

f(a, b) 与下列( )语句的功能最类似。

A

a.rfind(b)

B

a.substr(b)

C

a.compare(b)

D

a.find(b)

21
单选题3

当输入为“baaabaaabaaabaaaa aaaa”,第 20 行的“j++”语句执行次数为 (  )。

A

999

B

111111

C

121212

D

101010

22
判断题1
阅读程序代码(共 22-27 题共用)
#include <iostream>
using namespace std;
const int MAXN = 105;
int n, m, k, val[MAXN];
int temp[MAXN], cnt[MAXN];

void init() {
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> val[i];
    int maximum = val[0];
    for (int i = 1; i < n; i++)
        if (val[i] > maximum) maximum = val[i];
    m = 1;
    while (maximum >= k) {
        maximum /= k;
        m++;
    }
}
 
void solve() {
    int base = 1;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < k; j++) cnt[j] = 0;
        for (int j = 0; j < n; j++) cnt[val[j] / base % k]++;
        for (int j = 1; j < k; j++) cnt[j] += cnt[j - 1];
        for (int j = n - 1; j >= 0; j--) {
            temp[cnt[val[j] / base % k] - 1] = val[j];
            cnt[val[j] / base % k]--;
        }
        for (int j = 0; j < n; j++) val[j] = temp[j];
        base *= k;
    }
}

int main()  {
    init();
    solve();
    for (int i = 0; i < n; i++) cout << val[i] << ' ';
    cout << endl;
    return 0;
}

假设输入的 nnn 为不大于 100100100 的正整数,kkk 为不小于 222 且不大于 100100100 的正整数, val[i] 在 int 表示范围内, 这是一个不稳定的排序算法。(  )

A

正确

B

错误

23
判断题1

假设输入的 nnn 为不大于 100100100 的正整数,kkk 为不小于 222 且不大于 100100100 的正整数, val[i] 在 int 表示范围内, 该算法的空间复杂度仅与 nnn 有关。(  )

A

正确

B

错误

24
判断题1

假设输入的 nnn 为不大于 100100100 的正整数,kkk 为不小于 222 且不大于 100100100 的正整数, val[i] 在 int 表示范围内,该算法的时间复杂度为 O(m (n +k))\mathcal{O}(m (n + k))O(m (n +k))。(  )

A

错误

B

正确

25
单选题3

假设输入的 nnn 为不大于 100100100 的正整数,kkk 为不小于 222 且不大于 100100100 的正整数, val[i] 在 int 表示范围内,当输入为“5 3 98 26 91 37 46”时,程序第一次执行到第 36 行, val[] 数组的内容依次为(  )。

A

91 46 37 26 98

B

98 26 46 91 37

C

91 26 46 37 98

D

91 37 46 98 26

26
单选题3

假设输入的 nnn 为不大于 100100100 的正整数,kkk 为不小于 222 且不大于 100100100 的正整数, val[i] 在 int 表示范围内,若 val[i] 的最大值为 100100100kkk 取( )时算法运算次数最少。

A

333

B

222

C

101010

D

不确定

27
单选题3

假设输入的 nnn 为不大于 100100100 的正整数,kkk 为不小于 222 且不大于 100100100 的正整数, val[i] 在 int 表示范围内,当输入的 kkk 比 val[i] 的最大值还大时,该算法退化为( )算法。

A

冒泡排序

B

桶排序

C

选择排序

D

计数排序

28
判断题1
阅读程序代码(共 28-33 题共用)
#include <iostream>
#include <algorithm>
using namespace std;
 
const int MAXL = 1000; 

int n, k, ans[MAXL];

int main(void) 
{
    cin >> n >> k;
    if (!n) cout << 0 << endl;
    else 
    {
        int m = 0;
        while (n)        
        {
            ans[m++] = (n % (-k) + k) % k;
            n = (ans[m - 1] - n) / k;
        }
        for (int i = m - 1; i >= 0; i--)
            cout << char(ans[i] >= 10 ?
                ans[i] + 'A' - 10 :
                ans[i] + '0');
        cout << endl; 
    }
    return 0;
}

假设输入的 nnn 在 int 范围内,kkk 为不小于 222 且不大于 363636 的正整数,该算法的时间复杂度为 O(log⁡kn)\mathcal{O}(\log_{k}{n})O(logkn)。(  )

A

错误

B

正确

29
判断题1

假设输入的 nnn 在 int 范围内,kkk 为不小于 222 且不大于 363636 的正整数,删除第 23 行的强制类型转换,程序的行为不变。(  )

A

正确

B

错误

30
判断题1

假设输入的 nnn 在 int 范围内,kkk 为不小于 222 且不大于 363636 的正整数,除非输入的 nnn000,否则程序输出的字符数为 Θ(⌊log⁡k∣n∣⌋+1)\Theta(\lfloor\log_{k}{|n|}\rfloor + 1)Θ(⌊logkn+1)。(  )

A

错误

B

正确

31
单选题3

假设输入的 nnn 在 int 范围内,kkk 为不小于 222 且不大于 363636 的正整数,当输入为“100 7”时,输出为(  )

A

151515151515

B

244244244

C

175417541754

D

202202202

32
单选题3

假设输入的 nnn 在 int 范围内,kkk 为不小于 222 且不大于 363636 的正整数,当输入为“-255 8”时,输出为“(  )”。

A

417417417

B

400400400

C

140014001400

D

140114011401

33
单选题3

假设输入的 nnn 在 int 范围内,kkk 为不小于 222 且不大于 363636 的正整数,当输入为“1000000 19”时,输出为“(  )”。

A

BG939

B

7CF1B

C

1CD428

D

87GIB

完善程序
34
单选题3
阅读程序代码(共 34-38 题共用)
#include <bits/stdc++.h>
using namespace std;

int solve(int *a1, int *a2, int n, int k) {
    int left1 = 0, right1 = n - 1;
    int left2 = 0, right2 = n - 1;
    while (left1 <= right1 && left2 <= right2) {
        int m1 = (left1 + right1) >> 1;
        int m2 = (left2 + right2) >> 1;
        int cnt = ①;
        if (②) {
            if (cnt < k) left1 = m1 + 1;
            else right2 = m2 - 1;
        } else {
            if (cnt < k) left2 = m2 + 1;
            else right1 = m1 - 1;
        }
    }
    if (③) {
        if (left1 == 0) {
            return a2[k - 1];
        } else {
            int x = a1[left1 - 1], ④;
            return std::max(x, y);
        }
    } else {
        if (left2 == 0) {
            return a1[k - 1];
        } else {
            int x = a2[left2 - 1], ⑤;
            return std::max(x, y);
        }
    }
}

(归并第 kkk 小) 已知两个长度均为 nnn 的有序数组 a1a2 (均为递增序,但不保证严格单调递增),并且给定正整数 kkk (1≤k≤2n1\leq k\leq 2n1k2n),求数组 a1a2 归并排序后的数组里第 kkk 小的数值。

试补全程序。

①处应填( )

A

(m1 + m2) * 2

B

(m1 - 1) + (m2 - 1)

C

m1 + m2

D

(m1 + 1) + (m2 + 1)

35
单选题3

(归并第 kkk 小) 已知两个长度均为 nnn 的有序数组 a1a2 (均为递增序,但不保证严格单调递增),并且给定正整数 kkk (1≤k≤2n1\leq k\leq 2n1k2n),求数组 a1a2 归并排序后的数组里第 kkk 小的数值。

试补全程序。

②处应填(  )

A

a1[m1] == a2[m2]

B

a1[m1] != a2[m2]

C

a1[m1] >= a2[m2]

D

a1[m1] <= a2[m2]

36
单选题3

(归并第 kkk 小) 已知两个长度均为 nnn 的有序数组 a1a2 (均为递增序,但不保证严格单调递增),并且给定正整数 kkk (1≤k≤2n1\leq k\leq 2n1k2n),求数组 a1a2 归并排序后的数组里第 kkk 小的数值。

试补全程序。

③处应填(  )

A

left1 == right1

B

left1 != right1

C

left1 < right1

D

left1 > right1

37
单选题3

(归并第 kkk 小) 已知两个长度均为 nnn 的有序数组 a1a2 (均为递增序,但不保证严格单调递增),并且给定正整数 kkk (1≤k≤2n1\leq k\leq 2n1k2n),求数组 a1a2 归并排序后的数组里第 kkk 小的数值。

试补全程序。

④处应填(  )

A

y = a1[k - left2 - 1]

B

y = a1[k - left2]

C

y = a2[k - left1]

D

y = a2[k - left1 - 1]

38
单选题3

(归并第 kkk 小) 已知两个长度均为 nnn 的有序数组 a1a2 (均为递增序,但不保证严格单调递增),并且给定正整数 kkk (1≤k≤2n1\leq k\leq 2n1k2n),求数组 a1a2 归并排序后的数组里第 kkk 小的数值。

试补全程序。

⑤处应填(  )

A

y = a1[k - left2]

B

y = a2[k - left1 - 1]

C

y = a2[k - left1]

D

y = a1[k - left2 - 1]

39
单选题3
阅读程序代码(共 39-43 题共用)
#include <bits/stdc++.h>
using namespace std;
const int N = 110;

int f[N][N];
int ans;
int a, b, c;
int init;

int dfs(int x, int y) {
    if (f[x][y] != init)
        return f[x][y];
    if (x == c || y == c)
        return f[x][y] = 0;
    f[x][y] = init - 1;
    f[x][y] = min(f[x][y], dfs(a, y) + 1);
    f[x][y] = min(f[x][y], dfs(x, b) + 1);
    f[x][y] = min(f[x][y], dfs(0, y) + 1);
    f[x][y] = min(f[x][y], dfs(x, 0) + 1);
    int t = min(a - x, y);
    f[x][y] = min(f[x][y], ①);
    t = min(x, b - y);
    f[x][y] = min(f[x][y], ②);
    return f[x][y];
}

void go(int x, int y) {
    if (③)
        return;
    if (f[x][y] == dfs(a, y) + 1) {
        cout << "FILL(1)" << endl;
        go(a, y);
    } else if (f[x][y] == dfs(x, b) + 1) {
        cout << "FILL(2)" << endl;
        go(x, b);
    } else if (f[x][y] == dfs(0, y) + 1) {
        cout << "DROP(1)" << endl;
        go(0, y);
    } else if (f[x][y] == dfs(x, 0) + 1) {
        cout << "DROP(2)" << endl;
        go(x, 0);
    } else {
        int t = min(a - x, y);
        if (f[x][y] == ④) {
            cout << "POUR(2,1)" << endl;
            go(x + t, y - t);
        } else {
            t = min(x, b - y);
            if (f[x][y] == ⑤) {
                cout << "POUR(1,2)" << endl;
                go(x - t, y + t);
            } else
                assert(0);
        }
    }
}

int main() {
    cin >> a >> b >> c;
    ans = 1 << 30;
    memset(f, 127, sizeof f);
    init = **f;
    if ((ans = dfs(0, 0)) == init - 1)
        cout << "impossible";
    else {
        cout << ans << endl;
        go(0, 0);
    }
}

POUR(i,j)POUR(i,j)POUR(i,j):将容器 iii 的水倒进容器 jjj (完成此操作后,要么容器 jjj 被灌满,要么容器 iii 被清空)。

A

dfs(x + t, y - t) - 1

B

dfs(x - t, y + t) - 1

C

dfs(x - t, y + t) + 1

D

dfs(x + t, y - t) + 1

40
单选题3

POUR(i,j)POUR(i,j)POUR(i,j):将容器 iii 的水倒进容器 jjj (完成此操作后,要么容器 jjj 被灌满,要么容器 iii 被清空)。

A

dfs(x + t, y - t) + 1

B

dfs(x - t, y + t) - 1

C

dfs(x + t, y - t) - 1

D

dfs(x - t, y + t) + 1

41
单选题3

POUR(i,j)POUR(i,j)POUR(i,j):将容器 iii 的水倒进容器 jjj (完成此操作后,要么容器 jjj 被灌满,要么容器 iii 被清空)。

A

x >= c || y >= c

B

x >= c && y >= c

C

x == c && y == c

D

x == c || y == c

42
单选题3

POUR(i,j)POUR(i,j)POUR(i,j):将容器 iii 的水倒进容器 jjj (完成此操作后,要么容器 jjj 被灌满,要么容器 iii 被清空)。

A

dfs(x + t, y - t) - 1

B

dfs(x - t, y + t) + 1

C

dfs(x - t, y + t) - 1

D

dfs(x + t, y - t) + 1

43
单选题3

POUR(i,j)POUR(i,j)POUR(i,j):将容器 iii 的水倒进容器 jjj (完成此操作后,要么容器 jjj 被灌满,要么容器 iii 被清空)。

A

dfs(x + t, y - t) + 1

B

dfs(x + t, y - t) - 1

C

dfs(x - t, y + t) - 1

D

dfs(x - t, y + t) + 1