#J0006. CSP-J 2025 初赛模拟卷 6

CSP-J 2025 初赛模拟卷 6

2025CSP-J初赛模拟卷 6

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

第 1 题 深度优先搜索时,控制与记录搜索过程的数据结构是( )。
{{ select(1) }}

  • 队列
  • 链表
  • 哈希表

第 2 题 计算机的中央处理器的组成部件是( )。
{{ select(2) }}

  • 控制器和存储器
  • 运算器和存储器
  • 控制器、存储器和运算器
  • 运算器和控制器

第 3 题 一个正整数在十六进制下有 200 位,则它在二进制下最多可能有( )位。
{{ select(3) }}

  • 801
  • 798
  • 799
  • 800

第 4 题 一个由 2025 个元素组成的数组已经从小到大排好序,采用二分查找,最多需要( )次能够判断是否存在所查找的元素。
{{ select(4) }}

  • 2025
  • 12
  • 11
  • 10

第 5 题 无向完全图 G 有 10 个顶点,它有( )条边。
{{ select(5) }}

  • 45
  • 90
  • 72
  • 36

第 6 题 在 8 位二进制补码中,10110110 表示的是十进制下的( )。
{{ select(6) }}

  • -202
  • -74
  • 202
  • 74

第 7 题 某市有 2025 名学生参加编程竞赛选拔,试卷中有 20 道选择题,每题答对得 5 分,答错或者不答得 0 分,那么至少有( )名同学得分相同。
{{ select(7) }}

  • 99
  • 98
  • 97
  • 96

第 8 题 以下哪个操作运算符优先级最高?( )
{{ select(8) }}

  • &&
  • ||
  • >>
  • ++

第 9 题 如果根结点的深度是 1,则一棵恰好有 2025 个叶子结点的二叉树的深度不可能是( )。
{{ select(9) }}

  • 11
  • 12
  • 13
  • 2025

第 10 题 现代通用计算机之所以可以表示比较大或者比较小的浮点数,是因为使用了( )。
{{ select(10) }}

  • 原码
  • 补码
  • 反码
  • 阶码

第 11 题 在 C++ 语言中,一个数组定义为 int a[6] = {1, 2, 3, 4, 5, 6};,一个指针定义为 int *p = &a[3];,则执行 a[2] *= *p; 后,数组 a 中的值会变为( )。
{{ select(11) }}

  • {1, 2, 4, 4, 5, 6}
  • {2, 2, 3, 4, 5, 6}
  • {1, 2, 2, 4, 5, 6}
  • {1, 2, 3, 4, 5, 6}

第 12 题 下面的 C++ 代码执行后的输出是( )。

#include 
using namespace std;
int print(int x) {
    cout  1)
        return x;
    else
        return print(x - 1) + print(x - 2);
}
int main() {
    cout  a_3\),\(a_3  a_5\),则称该五位数为波形数,如 89674 就是一个波形数。由 1、2、3、4、5 组成的没有重复数字的五位数是波形数的概率是( )。  
{{ select(15) }}  
-  \(1/5\)  
-  \(1/6\)  
-  \(2/15\)  
-  \(1/3\)  

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

**(1)**  
```cpp
01 #include 
02 using namespace std;
03 using i64 = long long;
04 
05 i64 check(const string &s, int p) {
06     if (p > s;
13     i64 ans = 0;
14     for (int i = 0; i = 0; i--) {
18         ans += check(s, i);
19     }
20     cout ` 换为 ``,程序依然可以正常运行。  
{{ select(18) }}  
- 对
- 错

**选择题**  
19. 若输入 `5810438174`,则输出是( )。  
{{ select(19) }}  
-  `7`(换行)`0`  
-  `8`(换行)`0`  
-  `9`(换行)`0`  
-  `10`(换行)`0`  

20. 下面哪个选项是正确的?( )  
{{ select(20) }}  
-  把 `check` 函数中的第一个参数 `const` 去掉也可以正常运行  
-  把 `check` 函数中的 `p >= 1` 去掉依然可以得到正确的答案  
-  `check` 函数用来判断由 `s[p-1]` 和 `s[p]` 组成的两位数是否为 4 的倍数  
-  整段程序的时间复杂度为 \(O(n \log n)\)

**(2)**  
```cpp
01 #include 
02 using namespace std;
03 
04 string calc(string s, string t) {
05     const int n = s.size();
06     if (t.size() > s.size())
07         return "";
08     unordered_map mp;
09     int cnt = t.size();
10     for (auto v : t)
11         mp[v]++;
12     string ans;
13     int len = 0x3f3f3f3f;
14     for (int i = 0, j = 0; i  0)
16             cnt--;
17         mp[s[i]]--;
18         while (mp[s[j]]  cur_len)
23                 ans = s.substr(j, cur_len);
24         }
25     }
26     return ans;
27 }
28 
29 int main() {
30     string s, t;
31     cin >> s >> t;
32     cout 
02 #include 
03 #include 
04 
05 using namespace std;
06 
07 const int N = 1e5 + 10;
08 int n, s, cnt, ans, res;
09 int a[N], b[N];
10 
11 bool check(int mid) {
12     for (int i = 1; i > 1;
28         if (check(mid)) {
29             cnt = mid;
30             ans = res;
31             l = mid + 1;
32         } else
33             r = mid - 1;
34     }
35     printf("%d %d\n", cnt, ans);
36     return 0;
37 }

判断题
27. 若输入 4 100 12 5 6,则程序的输出为 4 54
{{ select(27) }}

  1. 对于任意的输入,cnt 的一个必定合法的取值为 n
    {{ select(28) }}
  1. 这个程序的时间复杂度为 (O(n \log n))。
    {{ select(29) }}

选择题
30. 当输入为 3 11 2 3 5 时,程序的输出为( )。
{{ select(30) }}

  • 1 11
  • 2 11
  • 3 8
  • 0 0
  1. 代码中 check 函数的作用是什么?( )
    {{ select(31) }}
  • 判断当前数组是否有序
  • 检查是否能从数组中选出 mid 个数,使得它们的总和小于或等于 s
  • 判断数组的所有元素是否大于某个值
  • 计算数组元素的平均值
  1. (4 分)变量 cntans 的作用分别是什么?( )
    {{ select(32) }}
  • cnt 记录满足条件的最大 mid 值,ans 记录对应的总和
  • cnt 记录数组的长度,ans 记录数组中的最大值
  • cnt 表示排序后的最小值索引,ans 记录当前结果的最小值
  • cnt 表示满足条件的元素个数,ans 记录最终的目标值

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

(1)
题目描述:有 T 组数据,每组数据输入 n (1 02 using namespace std; 03 #define maxn 500005 04 int a[maxn]; 05 map q; 06 void check(int x) { 07 for (int i = 2; i 1) ②; 14 } 15 void solve() { 16 int n; 17 cin >> n; 18 for (int i = 1; i > T; 34 while (T--) { 35 solve(); 36 } 37 return 0; 38 }

33. ① 处应填( )。  
{{ select(33) }}  
-  `sqrt(x)`  
-  `pow(x, 2)`  
-  `pow(x, 3)`  
-  `log(x)`  

34. ② 处应填( )。  
{{ select(34) }}  
-  `q[x]--`  
-  `q[x] /= 2`  
-  `q[x]++`  
-  `q[x] *= 2`  

35. ③ 处应填( )。  
{{ select(35) }}  
-  `k / n != 0`  
-  `k / n == 0`  
-  `k % n != 0`  
-  `k % n == 0`  

**(2)**  
题目描述:输入 n(1  ≤ n  ≤ 1 X $10^5$),表示有 n 座激光塔。然后输入 n 行,每行有两个数 p[i](1  ≤ p[i]  ≤ 1 X $10^6$)和 k[i](1  ≤ k[i]  ≤ 1 X $10^5$),分别表示第 i 座激光塔的位置和威力。保证所有激光塔的位置互不相同。游戏规则:按照 p[i] 从大到小依次激活激光塔。当一座激光塔被激活时,它会摧毁它左侧所有满足 p[i] - p[j]  ≤ k[i] 的激光塔j。被毁的激光塔无法被激活。在游戏开始前,你可以在最右边的激光塔的右侧,再添加一座激光塔,位置和威力由你决定。你希望被摧毁的激光塔的数量尽量少。输出这个最小值。  

```cpp
01 #include 
02 using namespace std;
03 const int N = 100000;
04 const int inf = 2147483647;
05 struct beacon {
06     int pos;
07     int power;
08 };
09 
10 int n, ans = inf, dp[N + 5];
11 beacon beacons[N + 5];
12 bool cmp(beacon a, beacon b) {
13     return ①;
14 }
15 
16 int main() {
17     cin >> n;
18     for (int i = 1; i > beacons[i].pos >> beacons[i].power;
20     }
21     sort(beacons + 1, beacons + n + 1, cmp);
22     ②;
23     for (int i = 2; i  b.pos`  
-  `a.pos  b.power`  

39. ② 处应填( )。  
{{ select(39) }}  
-  `dp[1] = 0`  
-  `dp[1] = inf`  
-  `dp[1] = 1`  
-  `dp[i] = inf`  

40. ③ 处应填( )。  
{{ select(40) }}  
-  `beacons[i].pos`  
-  `beacons[i].power`  
-  `beacons[i].pos + beacons[i].power`  
-  `beacons[i].pos - beacons[i].power`  

41. ④ 处应填( )。  
{{ select(41) }}  
-  `lower_bound(beacons + 1, beacons + n, find, cmp)`  
-  `upper_bound(beacons + 1, beacons + n + 1, find, cmp)`  
-  `lower_bound(beacons + 1, beacons + n + 1, find, cmp)`  
-  `upper_bound(beacons + 1, beacons + n, find, cmp)`  

42. ⑤ 处应填( )。  
{{ select(42) }}  
-  `n - dp[i]`  
-  `dp[i] - i`  
-  `dp[i]`  
-  `dp[i] + n - i`