#91633. 2025 CSP-X 初赛模拟题 1

时间限制:1000 ms 内存限制:512 MB 类型:传统 评测:文本比较 上传者: cwc

题目描述

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

1.  符号表示异或运算, 的结果是()。

A.

B.

C.

D.

2. 每个操作数都只有一位,后缀表达式 863-* 对应的前缀表达式为()。

A. *8-63

B. *86-3

C. *-863

D. 8*-63

3. 将数组 变为从小到大有序的序列,每次可以交换相邻两个元素,问最少需要交换多少次()。

A.

B.

C.

D.

4. 以下排序算法的常见实现中,哪个选项的说法是错误的()。

A. 计数排序是不稳定的

B. 冒泡排序是稳定的

C. 简单插入排序是稳定的

D. 简单选择排序是不稳定的

5. 小图刚买了一个新内存,容量为 GB,以下哪个容量和小图新内存的容量相同()。

A. TB

B. MB

C. KB

D. B

6. 假设 a 数组是长度为 n 的整数数组,从小到大有序,下面这段代码的时间复杂度是多少()。

int f(int l, int r, int key) {
    if (l > r) return -1;
    int mid = (l + r) / 2;
    if (key == a[mid]) return mid;
    else if (key < a[mid]) return f(l, mid - 1, key);
    else return f(mid + 1, r, key);
} 

A.

B.

C.

D.

7. 以下哪组操作能完成在双向循环链表中删除节点 p 的效果(其中,next 域为节点的直接后继,prev 域为节点的直接前驱)()。

A. p->next->prev = p->next; p->prev->next = p->prev;

B. p->next->prev = p->prev; p->prev->next = p->next;

C. p->next->prev = p; p->prev->next = p;

D. p->next = p->pre; p->pre = p->next;

8. 在一个无向简单图(无自环和重边)中有五个节点,编号为 ,以下选项中,都会给出每个节点的度数,哪一种情况是不符合实际的()。

A.

B.

C.

D.

9.  个无标号节点可以组成 () 个不同的二叉树。

A.

B.

C.

D.

10. 以下程序的输出是()。

int sum = 0;
for (int i = 1, j = 2; i <= 8; i++, j *= 2) {
    sum += j;
} 
cout << sum << endl;

A.

B.

C.

D.

11. 字符串 ABBBCDD 中有 () 个不同的子串。

A.

B.

C.

D.

12. 一棵二叉树的层序遍历为 ABCDEF, 中序遍历为 EDFBAC, 则其先序遍历为 ()。

A. ABCDEF

B. ABCEFD

C. ABDEFC

D. BDEFAC

13.  有一个容量为 的空栈 S, 将 A, B, C, D, E依次入栈,则 () 不是可能的出栈序列。

A. A, D, E, C, B

B. B, A, E, D, C

C. C, D, B, E, A

D. D, E, C, B, A

14.  现有 ABCDE 个人排队,要求 D 一定要在 CE 之间( 个人不一定需要相邻),共有 () 种不同的排队方法。

A.

B.

C.

D.

15.  在一个数轴上,每一次可以向左或者向右走 步,从 位置出发走 步后位于 位置,一共有 ()种不同的走法。

A.

B.

C.

D.

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)

(1)

01 #include <iostream>
02 using namespace std;
03 
04 int f1(int a, int b) {
05     if (a == b) return a;
06     else if (a > b) return f1(a - b, b);
07     else return f1(a, b - a);
08 }
09 
10 int f2(int a, int b) {
11     if (b == 0) return a;
12     else return f2(b, a % b);
13 }
14 
15 int main() {
16     int a, b;
17     cin >> a >> b;
18     cout << f1(a, b) << endl;
19     cout << f2(a, b) << endl;
20     return 0;
21 }

输入的数为不超过 的正整数,完成下面的判断题和单选题。

判断题
  1. 输入的两个数为 ,第一行输出的结果为 。( )

  2. 两个函数的时间复杂度相同。( )

  3. (2 分)两个函数的功能相同。( )

单选题
  1. (4 分)输入的两个数为 ,第二行输出的结果为( )。

    A.

    B.

    C.

    D.

  2. 以下哪一对输入数据,会让 f1 函数被调用的次数最多( )。

    A.

    B.

    C.

    D.

(2)

01 #include <iostream>
02 using namespace std;
03 
04 const int N = 1e4 + 10;
05 
06 int n, m, f[N];
07 
08 void getPrimeFacs(int n) {
09     for (int i = 2; i * i <= n; i++) {
10         int cnt = 0;
11         while (n % i == 0) {
12             n /= i;
13             cnt++;
14         }
15         f[i] = max(f[i], cnt);
16     }
17     if (n > 1) f[n] = max(f[n], 1);
18 }
19 
20 int main() {
21     cin >> n;
22     for (int i = 0; i < n; i++) {
23         cin >> m;
24         getPrimeFacs(m);
25     }
26     for (int i = 2; i < N; i++) {
27         if (f[i] > 0) {
28             cout << i << "^" << f[i] << " ";
29         }
30     }
31     return 0;
32 }

输入的每个数都是不超过 的正整数,完成下面的判断题和单选题。

判断题
  1. 当输入为 2 5 7 时,程序的输出为 2^1 5^1 7^1。( )

  2. 当输入为 2 4 5 时,程序的输出为 2^2 5^1。( )

  3. (2 分)如果删除第 行并且将第 行修改为 for (int i = 2; i <= n; i++),则对于任意合法输入,程序的输出保持不变。( )

  4. (2 分)程序运行的过程中,变量 cnt 的值不可能超过 13 。( )

单选题
  1. 程序的时间复杂度为( )。

    A.

    B.

    C.

    D.

  2. 如果删除第 行,以下哪一组输入仍然能得到正确的(与删除之前一样的)输出( )。

    A. 2 30 97

    B. 2 100 88

    C. 2 3072 1024

    D. 2 121 18

(3)

01 #include <iostream>
02 using namespace std;
03 
04 const int N = 5010;
05 
06 int a[N];
07 
08 int findMin(int l, int r) {
09     int pos = l;
10     for (int i = l; i <= r; ++i) {
11         if (a[i] < a[pos]) pos = i;
12     }
13     return pos;
14 }
15 
16 long long sol(int l, int r, int h) {
17     if (l > r) return 0;
18     if (l == r) return a[l] > h;
19     int pos = findMin(l, r);
20     long long horizontal = (a[pos] - h) + sol(l, pos - 1, a[pos]) + sol(pos + 1, r, a[pos]);
21     long long vertical = r - l + 1;
22     return min(horizontal, vertical);
23 }
24 
25 int main() {
26     int n;
27     cin >> n;
28     for (int i = 1; i <= n; ++i) {
29         cin >> a[i];
30     }
31     cout << sol(1, n, 0) << "\n";
32     return 0;
33 }

输入一个整数 个整数 ,完成下面的判断题和单选题。

判断题
  1. (2 分)若数组 a 的所有元素相同,则程序输出 1。( )

  2. (2 分)程序一定不会执行到第 17 行的 return 0。( )

  3. (2 分)在 sol 函数中,递归子问题的参数 h 不小于原问题的参数 h。( )

单选题
  1. 若将 sol 函数中第 22 行的 return min(horizontal, vertical); 改为 return horizontal;,则程序的功能变为( )。

    A. 计算数组 a 中的最大值

    B. 计算数组 a 中不同元素的个数

    C. 计算数组 a 中最小值的位置(若存在多个最小值,则返回第一个)

    D. 以上均不正确

  2. 程序的时间复杂度为( )。

    A

    B.

    C.

    D.

  3. 若程序输入为 5 1 5 2 2 5,则程序输出为( )。

    A. 3

    B. 4

    C. 5

    D. 6

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

(1)勤奋读书

小明有一本新书,预估需要 分钟看完。接下来 天里,小明每天的空闲时间有 分钟。小明期望用连续的若干天把这本书看完,问最少需要多少天。

数据范围满足

提示:可以采用枚举和二分答案来求解,时间复杂度

试补全程序。

01 #include <iostream>
02 using namespace std;
03 
04 const int N = 2e5 + 10;
05 
06 int m, n;
07 int t[N], sum[N];
08 
09 bool check(int start, int end) {
10     return /*____1____*/;
11 }
12 
13 int binary_answer(int start, int l, int r) {
14     while (l <= r) {
15         int mid = (l + r) / 2;
16         if (/*____2____*/) r = mid - 1;
17         else l = mid + 1;
18     }
19     return /*____3____*/;
20 }
21 
22 int main() {
23     cin >> m >> n;
24     for (int i = 1; i <= n; i++) cin >> t[i];
25     for (int i = 1; i <= n; i++) sum[i] = sum[i-1] + t[i];
26     int ans = n;
27     for (int i = 1; i <= n; i++) {
28         int tmp = binary_answer(i, i, n);
29         if (/*____4____*/) ans = min(ans, /*____5____*/);
30     }
31     cout << ans << endl;
32     return 0;
33 }
  1. /*____1____*/ 处应填( )

    A. sum[end] - sum[start - 1] >= m

    B. sum[end] - sum[start - 1] > m

    C. sum[end] - sum[start] >= m

    D. sum[end] - sum[start] > m

  2. /*____2____*/ 处应填( )

    A. check(l, mid)

    B. check(start, mid)

    C. check(start, r)

    D. check(mid, r)

  3. /*____3____*/ 处应填( )

    A. r - 1

    B. r

    C. l

    D. l + 1

  4. /*____4____*/ 处应填( )

    A. i + tmp < n

    B. i + tmp <= n

    C. i + tmp - 1 <= n

    D. tmp <= n

  5. /*____5____*/ 处应填( )

    A. tmp

    B. tmp - i

    C. tmp - i + 1

    D. n - tmp + 1

(2)文本编辑器

小图最近学习了字符串和栈,他想模拟文本编辑器的一些操作,初始时编辑器文本为空,光标位于最左端。小图的程序要执行 次操作,每次操作为以下 种指令之一,代表含义如下:

  • L:光标左移一格(若已经在最左端则忽略此操作);
  • R:光标右移一格(若已经在文本最右端则忽略此操作);
  • I x:在光标左侧插入 xx 为输入的某个英文字母);
  • D:删除光标左侧字符(若光标在最左端则忽略此操作)。

​​ 次操作后,从左到右输出最终的文本内容。

试补全程序。

01 #include <iostream>
02 #include <stack>
03 #include <string>
04 using namespace std;
05 
06 stack<char> lStack, rStack;
07 
08 int main() {
09     int q;
10     cin >> q;
11     while (q--) {
12         char op, x;
13         cin >> op;
14         if (op == 'L') {
15             if (lStack.empty()) continue;
16             rStack.push(lStack.top());
17             lStack.pop();
18         }
19         else if (op == 'R') {
20             if (rStack.empty()) continue;
21             /*____1____*/;
22             rStack.pop();
23         }
24         else if (op == 'I') {
25             cin >> x;
26             /*____2____*/;
27         }
28         else {
29             if (/*____3____*/) continue;
30             lStack.pop();
31         }
32     }
33     string s;
34     while (!lStack.empty()) {
35         /*____4____*/;
36         lStack.pop();
37     }
38     while (!rStack.empty()) {
39         /*____5____*/;
40         rStack.pop();
41     }
42     cout << s << '\n';
43     return 0;
44 }
  1. /*____1____*/ 处应填( )

    A. lStack.push_front(rStack.front())

    B. lStack.push(rStack.top())

    C. lStack.push(rStack.top() - 1)

    D. lStack.push(rStack[0])

  2. /*____2____*/ 处应填( )

    A. lStack.push(x)

    B. lStack.push('x')

    C. rStack.push(x)

    D. rStack.push(lStack.top()); lStack.push(x)

  3. /*____3____*/ 处应填( )

    A. op != 'D'

    B. lStack.top() != x

    C. lStack.empty()

    D. lStack.empty() && rStack.empty()

  4. /*____4____*/ 处应填( )

    A. s += lStack.top()

    B. cout << lStack.top()

    C. rStack.push(lStack.top())

    D. rStack.push(lStack.front())

  5. /*____5____*/ 处应填( )

    A. s = rStack.top() + s

    B. s.insert(s.begin(), rStack.top())

    C. s.replace(s.size() - 1, 0, rStack.top())

    D. s.push_back(rStack.top())