林老师 · 客观题题库 · CSP-S 卷

CSP-S 卷

CSP-S 真题 2019~2023 · 11 组大题 / 66 小题 · 基础篇 · 由简到难 · 每小题 2 分 · 建议 100 分钟
真题
复刻
试卷编号OBJ-279089
题目总数11 题 · 145.0 分
试卷类型客观题
考生须知:
① 本卷为客观题单卷,合计 11 题 · 145.0 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 145.0 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

客 观 题

11 QUESTIONS · 2 POINTS EACH
第 1~6 题 阅读程序 (共 12 分) 未作答

完成下面的判断题和单选题。

1  #include <cstdio>
2  using namespace std;
3  int n;
4  int a[100];
5 
6  int main() {
7      scanf("%d", &n);
8      for (int i = 1; i <= n; ++i)
9          scanf("%d", &a[i]);
10      int ans = 1;
11      for (int i = 1; i <= n; ++i) {
12          if (i > 1 && a[i] < a[i - 1])
13              ans = i;
14          while (ans < n && a[i] >= a[ans + 1])
15              ++ans;
16          printf("%d\n", ans);
17      }
18      return 0;
19  }

1.

1616 行输出 ans 时,ans 的值一定大于 i。( )

(1 分)
2.

程序输出的 ans 小于等于 nn。( )

(1 分)
3.

若将第 1212 行的 < 改为 !=,程序输出的结果不会改变。( )

(1.5 分)
4.

当程序执行到第 1616 行时,若 ans-i>2,则 a[i+1]a[i]a[i+1]\le a[i]。( )

(1.5 分)
5.

若输入的 a 数组是一个严格单调递增的数列,此程序的时间复杂度是( )。

(3 分)
6.

最坏情况下,此程序的时间复杂度是( )。

(4 分)
CSP-S 2019 · 阅读程序 第16-21题 | 知识点 快速排序、数组越界、排序稳定性
第 7~12 题 阅读程序 (共 15 分) 未作答

本题中 ttss 的子序列的意思是:从 ss 中删去若干个字符,可以得到 tt;特别的,如果 s=ts=t,那么 tt 也是 ss 的子序列;空串是任何串的子序列。例如,acdabcde 的子序列,acdacd 的子序列,但 adc 不是 abcde 的子序列。

s[x..y] 表示 s[x]...s[y]yx+1y-x+1 个字符构成的字符串,若 x>yx>ys[x..y] 是空串。t[x..y] 同理。

1  #include <iostream>
2  #include <string>
3  using namespace std;
4  const int maxl = 202;
5  string s, t;
6  int pre[maxl], suf[maxl];
7 
8  int main() {
9      cin >> s >> t;
10      int slen = s.length(), tlen = t.length();
11      for (int i = 0, j = 0; i < slen; ++i) {
12          if (j < tlen && s[i] == t[j]) ++j;
13          pre[i] = j; // t[0..j-1]是s[0..i]的子序列
14      }
15      for (int i = slen - 1, j = tlen - 1; i >= 0; --i) {
16          if (j >= 0 && s[i] == t[j]) --j;
17          suf[i] = j; // t[j+1..tlen-1]是s[i..slen-1]的子序列
18      }
19      suf[slen] = tlen - 1;
20      int ans = 0;
21      for (int i = 0, j = 0, tmp = 0; i <= slen; ++i) {
22          while (j <= slen && tmp >= suf[j] + 1) ++j;
23          ans = max(ans, j - i - 1);
24          tmp = pre[i];
25      }
26      cout << ans << endl;
27      return 0;
28  }

提示:

t[0..pre[i]-1]s[0..i] 的子序列;

t[suf[i]+1..tlen-1]s[i..slen-1] 的子序列。

7.

程序输出时,suf 数组满足:对任意 0i<slen0\le i<slensuf[i]suf[i+1]suf[i]\le suf[i+1]。( )

(1 分)
8.

ts 的子序列时,输出一定不为 00。( )

(2 分)
9.

程序运行到第 2323 行时,j-i-1 一定不小于 00。( )

(2 分)
10.

ts 的子序列时,pre 数组和 suf 数组满足:对任意 0i<slen0\le i<slenpre[i]>suf[i+1]+1pre[i]>suf[i+1]+1。( )

(2 分)
11.

tlen=10,输出为 00,则 slen 最小为( )。

(4 分)
12.

tlen=10,输出为 22,则 slen 最小为( )。

(4 分)
CSP-S 2019 · 阅读程序 第28-33题 | 知识点 if-else、快速排序、数组越界
第 13~18 题 阅读程序 (共 12 分) 未作答

1  #include <iostream>
2  using namespace std;
3 
4  int n;
5  int d[1000];
6 
7  int main() {
8      cin >> n;
9      for (int i = 0; i < n; ++i)
10          cin >> d[i];
11      int ans = -1;
12      for (int i = 0; i < n; ++i)
13          for (int j = 0; j < n; ++j)
14              if (d[i] < d[j])
15                  ans = max(ans, d[i] + d[j] - (d[i] & d[j]));
16      cout << ans;
17      return 0;
18  }

假设输入的 nnd[i] 都是不超过 1000010000 的正整数,完成下面的判断题和单选题。

13.

nn 必须小于 10001000,否则程序可能会发生运行错误。( )

(1.5 分)
14.

输出一定大于等于 00。( )

(1.5 分)
15.

若将第 1313 行的 j = 0 改为 j = i + 1,程序输出可能会改变。( )

(1.5 分)
16.

将第 1414 行的 d[i] < d[j] 改为 d[i] != d[j],程序输出不会改变。( )

(1.5 分)
17.

若输入 nn100100,且输出为 127127,则输入的 d[i] 中不可能有( )。

(3 分)
18.

若输出的数大于 00,则下面说法正确的是( )。

(3 分)
CSP-S 2020 · 阅读程序 第16-21题 | 知识点 广度优先搜索、广度优先搜索、模拟
第 19~24 题 阅读程序 (共 13 分) 未作答

1  #include <iostream>
2  #include <cstdlib>
3  using namespace std;
4 
5  int n;
6  int d[10000];
7 
8  int find(int L, int R, int k) {
9      int x = rand() % (R - L + 1) + L;
10      swap(d[L], d[x]);
11      int a = L + 1, b = R;
12      while (a < b) {
13          while (a < b && d[a] < d[L])
14              ++a;
15          while (a < b && d[b] >= d[L])
16              --b;
17          swap(d[a], d[b]);
18      }
19      if (d[a] < d[L])
20          ++a;
21      if (a - L == k)
22          return d[L];
23      if (a - L < k)
24          return find(a, R, k - (a - L));
25      return find(L + 1, a - 1, k);
26  }
27 
28  int main() {
29      int k;
30      cin >> n;
31      cin >> k;
32      for (int i = 0; i < n; ++i)
33          cin >> d[i];
34      cout << find(0, n - 1, k);
35      return 0;
36  }

假设输入的 nnkkd[i] 都是不超过 1000010000 的正整数,且 kk 不超过 nn,并假设 rand() 函数产生的是均匀的随机数,完成下面的判断题和单选题。

19.

99 行的 x 的数值范围是 L+1L+1RR,即 [L+1,R][L+1,R]。( )

(1.5 分)
20.

将第 1919 行的 d[a] 改为 d[b],程序不会发生运行错误。( )

(1.5 分)
21.

当输入的 d[i] 是严格单调递增序列时,第 1717 行的 swap 平均执行次数是( )。

(2.5 分)
22.

当输入的 d[i] 是严格单调递减序列时,第 1717 行的 swap 平均执行次数是( )。

(2.5 分)
23.

若输入的 d[i]ii,此程序①平均的时间复杂度和②最坏情况下的时间复杂度分别是( )。

(2.5 分)
24.

若输入的 d[i] 都为同一个数,此程序平均的时间复杂度是( )。

(2.5 分)
CSP-S 2020 · 阅读程序 第22-27题 | 知识点 双指针、选择排序
第 25~30 题 阅读程序 (共 15 分) 未作答

1  #include <iostream>
2  #include <queue>
3  using namespace std;
4 
5  const int maxl = 2000000000;
6 
7  class Map {
8      struct item {
9          string key; int value;
10      } d[maxl];
11      int cnt;
12      public:
13      int find(string x) {
14          for (int i = 0; i < cnt; ++i)
15              if (d[i].key == x)
16                  return d[i].value;
17          return -1;
18      }
19      static int end() { return -1; }
20      void insert(string k, int v) {
21          d[cnt].key = k; d[cnt++].value = v;
22      }
23  } s[2];
24 
25  class Queue {
26      string q[maxl];
27      int head, tail;
28      public:
29      void pop() { ++head; }
30      string front() { return q[head + 1]; }
31      bool empty() { return head == tail; }
32      void push(string x) { q[++tail] = x; }
33  } q[2];
34 
35  string st0, st1;
36  int m;
37 
38  string LtoR(string s, int L, int R) {
39      string t = s;
40      char tmp = t[L];
41      for (int i = L; i < R; ++i)
42          t[i] = t[i + 1];
43      t[R] = tmp;
44      return t;
45  }
46 
47  string RtoL(string s, int L, int R) {
48      string t = s;
49      char tmp = t[R];
50      for (int i = R; i > L; --i)
51          t[i] = t[i - 1];
52      t[L] = tmp;
53      return t;
54  }
55 
56  bool check(string st, int p, int step) {
57      if (s[p].find(st) != s[p].end())
58          return false;
59      ++step;
60      if (s[p ^ 1].find(st) == s[p].end()) {
61          s[p].insert(st, step);
62          q[p].push(st);
63          return false;
64      }
65      cout << s[p ^ 1].find(st) + step << endl;
66      return true;
67  }
68 
69  int main() {
70      cin >> st0 >> st1;
71      int len = st0.length();
72      if (len != st1.length()) {
73          cout << -1 << endl;
74          return 0;
75      }
76      if (st0 == st1) {
77          cout << 0 << endl;
78          return 0;
79      }
80      cin >> m;
81      s[0].insert(st0, 0); s[1].insert(st1, 0);
82      q[0].push(st0); q[1].push(st1);
83      for (int p = 0;
84          !(q[0].empty() && q[1].empty());
85          p ^= 1) {
86          string st = q[p].front(); q[p].pop();
87          int step = s[p].find(st);
88          if ((p == 0 &&
89              (check(LtoR(st, m, len - 1), p, step) ||
90              check(RtoL(st, 0, m), p, step)))
91              ||
92              (p == 1 &&
93              (check(LtoR(st, 0, m), p, step) ||
94              check(RtoL(st, m, len - 1), p, step))))
95              return 0;
96      }
97      cout << -1 << endl;
98      return 0;
99  }

完成下面的判断题和单选题。

25.

输出可能为 00。( )

(1.5 分)
26.

若输入的两个字符串长度均为 101101 时,则 m=0m=0 时的输出与 m=100m=100 时的输出是一样的。( )

(1.5 分)
27.

若两个字符串的长度均为 nn,则最坏情况下,此程序的时间复杂度为 Θ(n!)\Theta(n!)。( )

(1.5 分)
28.

若输入的第一个字符串由 100100 个不同的字符构成,第二个字符串是第一个字符串的倒序,输入的 mm00,则输出为( )。

(2.5 分)
29.

已知当输入为 0123\n3210\n1 时输出为 44,当输入为 012345\n543210\n1 时输出为 1414,当输入为 01234567\n76543210\n1 时输出为 2828,则当输入为 0123456789ab\nba9876543210\n1 时输出为( )。其中 \n 为换行符。

(4 分)
30.

若两个字符串的长度均为 nn,且 0<m<n10<m<n-1,且两个字符串的构成相同(即任何一个字符在两个字符串中出现的次数均相同),则下列说法正确的是( )。提示:考虑输入与输出有多少对字符串后顺序不一样。

(4 分)
CSP-S 2020 · 阅读程序 第28-33题 | 知识点 冒泡排序、双端队列、if-else
第 31~36 题 阅读程序 (共 12 分) 未作答

1  #include <iostream>
2  #include <cmath>
3  using namespace std;
4 
5  const double r = acos(0.5);
6 
7  int a1, b1, c1, d1;
8  int a2, b2, c2, d2;
9 
10  inline int sq(const int x) { return x * x; }
11  inline int cu(const int x) { return x * x * x; }
12 
13  int main()
14  {
15      cout.flags(ios::fixed);
16      cout.precision(4);
17 
18      cin >> a1 >> b1 >> c1 >> d1;
19      cin >> a2 >> b2 >> c2 >> d2;
20 
21      int t = sq(a1 - a2) + sq(b1 - b2) + sq(c1 - c2);
22 
23      if (t <= sq(d2 - d1)) cout << cu(min(d1, d2)) * r * 4;
24      else if (t >= sq(d2 + d1)) cout << 0;
25      else {
26          double x = d1 - (sq(d1) - sq(d2) + t) / sqrt(t) / 2;
27          double y = d2 - (sq(d2) - sq(d1) + t) / sqrt(t) / 2;
28          cout << (x * x * (3 * d1 - x) + y * y * (3 * d2 - y)) * r;
29      }
30      cout << endl;
31      return 0;
32  }

假设输入的所有数的绝对值都不超过 10001000,完成下面的判断题和单选题。

31.

将第 2121 行中 t 的类型声明从 int 改为 double,不会影响程序运行的结果。( )

(1.5 分)
32.

将第 26262727 行中的 / sqrt(t) / 2 替换为 / 2 / sqrt(t),不会影响程序运行的结果。( )

(1.5 分)
33.

将第 2828 行中的 x * x 改成 sq(x)y * y 改成 sq(y),不会影响程序运行的结果。( )

(1.5 分)
34.

当输入为 0 0 0 1 1 0 0 1 时,输出为 1.3090。( )

(2 分)
35.

当输入为 1 1 1 1 1 1 1 2 时,输出为( )。

(3 分)
36.

这段代码的含义为( )。

(2.5 分)
CSP-S 2021 · 阅读程序 第16-21题 | 知识点 快速幂、费马小定理、do-while循环
第 37~42 题 阅读程序 (共 13.5 分) 未作答

1  #include <algorithm>
2  #include <iostream>
3  using namespace std;
4 
5  int n, a[1005];
6 
7  struct Node
8  {
9      int h, j, m, w;
10 
11      Node(const int _h, const int _j, const int _m, const int _w):
12          h(_h), j(_j), m(_m), w(_w)
13      { }
14 
15      Node operator+(const Node &o) const
16      {
17          return Node(
18              max(h, w + o.h),
19              max(max(j, o.j), m + o.h),
20              max(m + o.w, o.m),
21              w + o.w);
22      }
23  };
24 
25  Node solve1(int h, int m)
26  {
27      if (h > m)
28          return Node(-1, -1, -1, -1);
29      if (h == m)
30          return Node(max(a[h], 0), max(a[h], 0), max(a[h], 0), a[h]);
31      int j = (h + m) >> 1;
32      return solve1(h, j) + solve1(j + 1, m);
33  }
34 
35  int solve2(int h, int m)
36  {
37      if (h > m)
38          return -1;
39      if (h == m)
40          return max(a[h], 0);
41      int j = (h + m) >> 1;
42      int wh = 0, wm = 0;
43      int wht = 0, wmt = 0;
44      for (int i = j; i >= h; i--) {
45          wht += a[i];
46          wh = max(wh, wht);
47      }
48      for (int i = j + 1; i <= m; i++) {
49          wmt += a[i];
50          wm = max(wm, wmt);
51      }
52      return max(max(solve2(h, j), solve2(j + 1, m)), wh + wm);
53  }
54 
55  int main()
56  {
57      cin >> n;
58      for (int i = 1; i <= n; i++) cin >> a[i];
59      cout << solve1(1, n).j << endl;
60      cout << solve2(1, n) << endl;
61      return 0;
62  }

假设输入的所有数的绝对值都不超过 10001000,完成下面的判断题和单选题。

37.

程序总是会正常执行并输出两行两个相等的数。( )

(1.5 分)
38.

2828 行与第 3838 行分别有可能执行两次及以上。( )

(1.5 分)
39.

当输入为 5 -10 11 -9 5 -7 时,输出的第二行为 7。( )

(1.5 分)
40.

solve1(1, n) 的时间复杂度为( )。

(3 分)
41.

solve2(1, n) 的时间复杂度为( )。

(3 分)
42.

当输入为 10 -3 2 10 0 -8 9 -4 -5 9 4 时,输出的第一行为( )。

(3 分)
CSP-S 2021 · 阅读程序 第22-27题 | 知识点 选择排序、插入排序
第 43~48 题 阅读程序 (共 13 分) 未作答

1  #include <iostream>
2  #include <string>
3  #include <vector>
4 
5  using namespace std;
6 
7  int f(const string &s, const string &t)
8  {
9      int n = s.length(), m = t.length();
10 
11      vector<int> shift(128, m + 1);
12 
13      int i, j;
14 
15      for (j = 0; j < m; j++)
16          shift[t[j]] = m - j;
17 
18      for (i = 0; i <= n - m; i += shift[s[i + m]]) {
19          j = 0;
20          while (j < m && s[i + j] == t[j]) j++;
21          if (j == m) return i;
22      }
23 
24      return -1;
25  }
26 
27  int main()
28  {
29      string a, b;
30      cin >> a >> b;
31      cout << f(a, b) << endl;
32      return 0;
33  }

假设输入字符串由 ASCII 可见字符组成,完成下面的判断题和单选题。

43.

当输入为 abcde fg 时,输出为 -1。( )

(1 分)
44.

当输入为 abbababbbab abab 时,输出为 4。( )

(1.5 分)
45.

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

(1.5 分)
46.

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

(3 分)
47.

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

(3 分)
48.

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

(3 分)
CSP-S 2022 · 阅读程序 第16-21题 | 知识点 剪枝、if-else
第 49~54 题 阅读程序 (共 13.5 分) 未作答

1  #include <iostream>
2 
3  using namespace std;
4 
5  const int MAXN = 105;
6 
7  int n, m, k, val[MAXN];
8  int temp[MAXN], cnt[MAXN];
9 
10  void init()
11  {
12      cin >> n >> k;
13      for (int i = 0; i < n; i++) cin >> val[i];
14      int maximum = val[0];
15      for (int i = 1; i < n; i++)
16          if (val[i] > maximum) maximum = val[i];
17      m = 1;
18      while (maximum >= k) {
19          maximum /= k;
20          m++;
21      }
22  }
23 
24  void solve()
25  {
26      int base = 1;
27      for (int i = 0; i < m; i++) {
28          for (int j = 0; j < k; j++) cnt[j] = 0;
29          for (int j = 0; j < n; j++) cnt[val[j] / base % k]++;
30          for (int j = 1; j < k; j++) cnt[j] += cnt[j - 1];
31          for (int j = n - 1; j >= 0; j--) {
32              temp[cnt[val[j] / base % k] - 1] = val[j];
33              cnt[val[j] / base % k]--;
34          }
35          for (int j = 0; j < n; j++) val[j] = temp[j];
36          base *= k;
37      }
38  }
39 
40  int main()
41  {
42      init();
43      solve();
44      for (int i = 0; i < n; i++) cout << val[i] << ' ';
45      cout << endl;
46      return 0;
47  }

假设输入的 nn 为不大于 100100 的正整数,kk 为不小于 22 且不大于 100100 的正整数,val[i]int 表示范围内,完成下面的判断题和单选题。

49.

这是一个不稳定的排序算法。( )

(1.5 分)
50.

该算法的空间复杂度仅与 nn 有关。( )

(1.5 分)
51.

该算法的时间复杂度为 O(m(n+k))O(m(n+k))。( )

(1.5 分)
52.

当输入为 5 3 98 26 91 37 46 时,程序第一次执行到第 3636 行,val[] 数组的内容依次为( )。

(3 分)
53.

val[i] 的最大值为 100100kk 取( )时算法运算次数最少。

(3 分)
54.

当输入的 kkval[i] 的最大值还大时,该算法退化为( )算法。

(3 分)
CSP-S 2022 · 阅读程序 第22-27题 | 知识点 二分答案、滑动窗口
第 55~60 题 阅读程序 (共 13.5 分) 未作答

1  #include <iostream>
2  #include <algorithm>
3 
4  using namespace std;
5 
6  const int MAXL = 1000;
7 
8  int n, k, ans[MAXL];
9 
10  int main(void)
11  {
12      cin >> n >> k;
13      if (!n) cout << 0 << endl;
14      else
15      {
16          int m = 0;
17          while (n)
18          {
19              ans[m++] = (n % (-k) + k) % k;
20              n = (ans[m - 1] - n) / k;
21          }
22          for (int i = m - 1; i >= 0; i--)
23              cout << char(ans[i] >= 10 ?
24          ans[i] + 'A' - 10 :
25          ans[i] + '0');
26          cout << endl;
27      }
28      return 0;
29  }

假设输入的 nnint 范围内,kk 为不小于 22 且不大于 3636 的正整数,完成下面的判断题和单选题。

55.

该算法的时间复杂度为 O(logkn)O(\log_k n)。( )

(1.5 分)
56.

删除第 2323 行的强制类型转换,程序的行为不变。( )

(1.5 分)
57.

除非输入的 nn00,否则程序输出的字符数为 O(logkn+1)O(\lfloor\log_k|n|\rfloor+1)。( )

(1.5 分)
58.

当输入为 100 7 时,输出为( )。

(3 分)
59.

当输入为 -255 8 时,输出为( )。

(3 分)
60.

当输入为 1000000 19 时,输出为( )。

(3 分)
CSP-S 2022 · 阅读程序 第28-33题 | 知识点 二进制、埃氏筛、字符型
第 61~66 题 阅读程序 (共 12.5 分) 未作答

1  #include <iostream>
2  using namespace std;
3 
4  unsigned short f(unsigned short x) {
5      x ^= x << 6;
6      x ^= x >> 8;
7      return x;
8  }
9 
10  int main() {
11      unsigned short x;
12      cin >> x;
13      unsigned short y = f(x);
14      cout << y <<endl;
15      return 0;
16  }

假设输入的 xx 是不超过 6553565535 的自然数,完成下面的判断题和单选题。

61.

当输入非零时,输出一定不为零。( )

(1.5 分)
62.

f 函数的输入参数类型改为 unsigned int,程序的输出不变。( )

(2 分)
63.

当输入为 65535 时,输出为 63。( )

(1.5 分)
64.

当输入为 1 时,输出为 64。( )

(1.5 分)
65.

当输入为 512 时,输出为( )。

(3 分)
66.

当输入为 64 时,执行完第 55 行后 x 的值为( )。

(3 分)
CSP-S 2023 · 阅读程序 第16-21题 | 知识点 广度优先搜索、广度优先搜索、整型