#J0006. CSP-J 2025 初赛模拟卷 6
CSP-J 2025 初赛模拟卷 6
2025CSP-J初赛模拟卷 6
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
第 1 题 深度优先搜索时,控制与记录搜索过程的数据结构是( )。
{{ select(1) }}
- 队列
- 栈
- 链表
- 哈希表
第 2 题 计算机的中央处理器的组成部件是( )。
{{ select(2) }}
- 控制器和存储器
- 运算器和存储器
- 控制器、存储器和运算器
- 运算器和控制器
第 3 题 一个正整数在十六进制下有 位,则它在二进制下最多可能有( )位。
{{ select(3) }}
第 4 题 一个由 个元素组成的数组已经从小到大排好序,采用二分查找,最多需要( )次能够判断是否存在所查找的元素。
{{ select(4) }}
第 5 题 无向完全图 有 个顶点,它有( )条边。
{{ select(5) }}
第 6 题 在 位二进制补码中, 表示的是十进制下的( )。
{{ select(6) }}
第 7 题 某市有 名学生参加编程竞赛选拔,试卷中有 道选择题,每题答对得 分,答错或者不答得 分,那么至少有( )名同学得分相同。
{{ select(7) }}
第 8 题 以下哪个操作运算符优先级最高?( )
{{ select(8) }}
&&||>>++
第 9 题 如果根结点的深度是 ,则一棵恰好有 个叶子结点的二叉树的深度不可能是( )。
{{ select(9) }}
第 10 题 现代通用计算机之所以可以表示比较大或者比较小的浮点数,是因为使用了( )。
{{ select(10) }}
- 原码
- 补码
- 反码
- 阶码
第 11 题 在 C++ 语言中,一个数组定义为 int a[6] = {1, 2, 3, 4, 5, 6};,一个指针定义为 int *p = &a[3];,则执行 a[2] = *p; 后,数组 中的值会变为( )。
{{ 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 <bits/stdc++.h>
using namespace std;
int print(int x) {
cout << x << "$";
if (x == 1 || x == 2)
return x;
else
return print(x - 1) + print(x - 2);
}
int main() {
cout << print(4) << endl;
return 0;
}
{{ select(12) }}
4$3$2$2$44$3$2$2$1$54$3$2$1$2$44$3$2$1$2$5
第 13 题 小明往一个图书馆送书,第 天送 本,第 天送 本,第 天送 本,……,第 天送 本,他准备累计送到图书馆的书的总数能整除 就停止,那么小明应连续送( )天。
{{ select(13) }}
第 14 题 (共 个连续的 )的和的末 位数是( )。
{{ select(14) }}
第 15 题 在无重复数字的五位数 中,若 ,,,,则称该五位数为波形数,如 就是一个波形数。由 组成的没有重复数字的五位数是波形数的概率是( )。
{{ select(15) }}
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×;除特殊说明外,判断题每题 1.5 分,选择题每题 3 分,共计 40 分)
(1)
01 #include <bits/stdc++.h>
02 using namespace std;
03 using i64 = long long;
04
05 i64 check(const string &s, int p)
06 {
07 return (p>=1&&((s[p - 1]-'0')*10 + (s[p]-'0'))%4==0)?1ll*p:0ll;
08 }
09
10 int main() {
11 string s;
12 cin >> s;
13 i64 ans = 0;
14 for (int i = 0; i < s.length(); i++) {
15 ans += ((s[i] - '0') % 4 == 0);
16 }
17 for (int i = s.length() - 1; i >= 0; i--) {
18 ans += check(s, i);
19 }
20 cout << ans << endl;
21 cout << check("114514", 3) << endl;
22 return 0;
23 }
假设 , 回答下面问题。
判断题
16. 若程序输入 124,则程序输出 4(换行)0。
{{ select(16) }}
- 对
- 错
- 对于这段代码,
check("1234510", 2)的返回值为2。
{{ select(17) }}
- 对
- 错
- 若将头文件
<bits/stdc++.h>换为<cstdio>,程序依然可以正常运行。
{{ select(18) }}
- 对
- 错
选择题
19. 若输入 5810438174,则输出是( )。
{{ select(19) }}
7(换行)08(换行)09(换行)010(换行)0
- 下面哪个选项是正确的?( )
{{ select(20) }}
- 把
check函数中的第一个参数const去掉也可以正常运行 - 把
check函数中的p >= 1去掉依然可以得到正确的答案 check函数用来判断由s[p-1]和s[p]组成的两位数是否为 的倍数- 整段程序的时间复杂度为
(2)
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 string calc(string s, string t)
05 {
06 const int n = s.size();
07 if (t.size() > s.size())
08 return "";
09 unordered_map<char, int> mp;
10 int cnt = t.size();
11 for (auto v : t)
12 mp[v]++;
13 string ans;
14 int len = 0x3f3f3f3f;
15 for (int i = 0, j = 0; i < n; i++)
16 {
17 if(mp[s[i]] > 0)
18 cnt--;
19 mp[s[i]]--;
20 if(cnt == 0)
21 {
22 while (mp[s[j]] < 0)
23 mp[s[j++]]++;
24 int len = i - j + 1;
25 if(ans.empty() || ans.size() > len)
26 ans = s.substr(j,len);
27 mp[s[j++]]++;
28 cnt++;
29 }
30 }
31 return ans;
32 }
33
34 int main() {
35 string s, t;
36 cin >> s >> t;
37 cout << calc(s, t) << endl;
38 return 0;
39 }
判断题
21. 若输入 ADOBECODEBANC ABC,则输出为 BANC。
{{ select(21) }}
- 对
- 错
calc函数中的变量j只会增大,不会减小。
{{ select(22) }}
- 对
- 错
- (2 分)若删除第 行中的
len变量,程序将不能正常运行。
{{ select(23) }}
- 对
- 错
选择题
24. 当输入为 a aa 时,程序的输出为( )。
{{ select(24) }}
"a""aa""""-1"
- 若删除第 行代码,则当输入为
cabwefgewcwaefgcf cae时,程序的输出为( )。
{{ select(25) }}
"cwae""abwe""cabwe""fgewc"
- ( 分)设 , 则这段程序的时间复杂度为( )。
{{ select(26) }}
(3)
01 #include <iostream>
02 #include <cstdio>
03 #include <algorithm>
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 <= n; i++)
13 b[i] = a[i] + i * mid;
14 sort(b + 1, b + n + 1);
15 res = 0;
16 for (int i = 1; i <= mid && res <= s; i++)
17 res += b[i];
18 return res <= s;
19 }
20
21 int main() {
22 scanf("%d%d", &n, &s);
23 for (int i = 1; i <= n; i++)
24 scanf("%d", &a[i]);
25 int l = 0, r = n;
26 while (l < r) {
27 int mid = (l + r) >> 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 1 2 5 6,则程序的输出为 4 54。
{{ select(27) }}
- 对
- 错
- 对于任意的输入,
cnt的一个必定合法的取值为n。
{{ select(28) }}
- 对
- 错
- 这个程序的时间复杂度为 。
{{ select(29) }}
- 对
- 错
选择题
30. 当输入为 3 11 2 3 5 时,程序的输出为( )。
{{ select(30) }}
1 112 113 80 0
- 代码中
check函数的作用是什么?( )
{{ select(31) }}
- 判断当前数组是否有序
- 检查是否能从数组中选出
mid个数,使得它们的总和小于或等于s - 判断数组的所有元素是否大于某个值
- 计算数组元素的平均值
- ( 分)变量
cnt和ans的作用分别是什么?( )
{{ select(32) }}
cnt记录满足条件的最大mid值,ans记录对应的总和cnt记录数组的长度,ans记录数组中的最大值cnt表示排序后的最小值索引,ans记录当前结果的最小值cnt表示满足条件的元素个数,ans记录最终的目标值
三、完善程序(单选题,每小题 3 分,共计 30 分)
(1) 题目描述
有 组数据,每组数据输入 和长为 的数组 。
你可以执行如下操作任意次:选择 和 ,以及 的一个因子 。然后执行 a[i] /= x 和 a[j] *= x。能否使 中所有元素都相同?
输出 YES 或 NO。
01 #include <bits/stdc++.h>
02 using namespace std;
03 #define maxn 500005
04 int a[maxn];
05 map<int, int> q;
06 void check(int x) {
07 for (int i = 2; i <= ①; i++) {
08 while (x % i == 0) {
09 q[i]++;
10 x /= i;
11 }
12 }
13 if (x > 1) ②;
14 }
15 void solve()
16 {
17 int n;
18 cin >> n;
19 ③;
20 for (int i = 1; i <= n; i++) {
21 scanf("%d", &a[i]);
22 ④;
23 }
24 for (auto i : q) {
25 int k = i.second;
26 if ( ⑤ ) {
27 cout << "No" << endl;
28 return;
29 }
30 }
31 cout << "YES" << endl;
32 }
33 int main() {
34 int T = 1;
35 cin >> T;
36 while (T--) {
37 solve();
38 }
39 return 0;
40 }
- ① 处应填( )。
{{ select(33) }}
sqrt(x)pow(x, 2)pow(x, 3)log(x)
- ② 处应填( )。
{{ select(34) }}
q[x]--q[x] /= 2q[x]++q[x] *= 2
- ③ 处应填( )。
{{ select(35) }}
q.clear()q.erase(q.begin())q.swap(a)q.erase(a.end())
- ④ 处应该填 {{ select(36) }}
check(q)check(a)check(a[i])check(a[i-1])
- ⑤ 处应填( )。
{{ select(37) }}
k / n == 0k / n != 0k % n == 0k % n != 0
(2) 题目描述
输入 ,表示有 座激光塔。然后输入 行,每行有两个数 和 ,分别表示第 座激光塔的位置和威力 (保证所有激光塔的位置互不相同)
游戏规则:按照 从大到小依次激活激光塔。当一座激光塔被激活时,它会摧毁它左侧所有满足 的激光塔 。被毁的激光塔无法被激活。
在游戏开始前,你可以在最右边的激光塔的右侧,再添加一座激光塔,位置和威力由你决定。
你希望被摧毁的激光塔的数量尽量少。输出这个最小值。
01 #include <bits/stdc++.h>
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 <= n; ++i) {
19 cin >> beacons[i].pos >> beacons[i].power;
20 }
21 sort(beacons + 1, beacons + n + 1, cmp);
22 ②;
23 for (int i = 2; i <= n; ++i) {
24 beacon find;
25 find.pos = max(0, ③);
26 int destroy = ④ - (beacons + 1);
27 dp[i] = dp[destroy];
28 dp[i] += (i - destroy - 1);
29 }
30 for (int i = 1; i <= n; ++i) {
31 int destruction = ⑤;
32 if (destruction < ans)
33 ans = destruction;
34 }
35 cout << ans << endl;
36 return 0;
37 }
- ① 处应填( )。
{{ select(38) }}
a.power < b.powera.pos > b.posa.pos < b.posa.power > b.power
- ② 处应填( )。
{{ select(39) }}
dp[1] = 0dp[1] = infdp[1] = 1dp[i] = -inf
- ③ 处应填( )。
{{ select(40) }}
beacons[i].posbeacons[i].powerbeacons[i].pos + beacons[i].powerbeacons[i].pos - beacons[i].power
- ④ 处应填( )。
{{ 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)
- ⑤ 处应填( )。
{{ select(42) }}
n - dp[i]dp[i] - idp[i]dp[i] + n - i