#68. 普及组CSP-J2025初赛模拟卷1
普及组CSP-J2025初赛模拟卷1
普及组CSP-J2025初赛模拟卷1
一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
- 在标准ASCII码表中,已知英文字母
c
的ASCII码十进制表示是99,那么英文字母x
的ASCII码十六进制表示是( )。 {{ select(1) }}
77
78
79
7A
- 以下关于CSP与GESP的描述正确的是( )。 {{ select(2) }}
- CSP-J/CSP-S属于非专业级别软件能力认证,只有中小学生才能参加
- CSP-J/CSP-S是中国通信学会举办的程序设计竞赛
- GESP是中国电子学会举办的程序设计竞赛
- GESP C++七级成绩80分及以上或者八级成绩60分及以上,可以申请免CSP-J初赛
- 以下可以用作C++程序中的变量名的是( )。 {{ select(3) }}
_x1
new
class
public
- 以下不属于桌面或者手机操作系统的是( )。 {{ select(4) }}
Linux
Android
MATLAB
Windows 11
- C++中使用输入和输出函数
cin
和cout
会用到( )头文件。 {{ select(5) }}
iostream
cmath
cstdio
algorithm
- 寻找最短路径的广度优先搜索算法经常用到的数据结构是( )。 {{ select(6) }}
- 栈
- 链表
- 向量
- 队列
- 以下哪个域名后缀不属于中华人民共和国管辖? {{ select(7) }}
cn
uk
hk
mo
- 下列排序算法中,平均情况下( )算法的时间复杂度最小。 {{ select(8) }}
- 插入排序
- 选择排序
- 归并排序
- 冒泡排序
- 关于计算机网络,下面的说法中正确的是( )。 {{ select(9) }}
- TCP是网络层协议
- 计算机病毒只能通过U盘等介质传播,不能通过计算机网络传播
- 计算机网络可以实现资源共享
- 公司内部的几台计算机组成的网络规模太小,不能称为计算机网络
- 序列
(7, 5, 1, 12, 3, 6, 9, 4)
的逆序对有( )个。 {{ select(10) }}
15
12
13
14
- 下列属于图像文件格式的是( )。 {{ select(11) }}
MPEG
DOCX
JPEG
WMV
- 不管
P
、Q
如何取值,以下逻辑表达式中取值恒为假的是( )。 {{ select(12) }}
(¬Q ∧ P) ∨ (Q ∧ ¬P)
((¬P ∨ Q) ∨ (P ∨ ¬Q)) ∧ P ∧ ¬Q
¬P ∧ (¬Q ∨ P) ∨ (Q ∨ ¬P) ∧ P
((¬P ∨ Q) ∨ (Q ∨ ¬P)) ∧ Q ∧ ¬P
- 树的根结点的高度为1,某完全二叉树有2025个结点,其高度是( )。 {{ select(13) }}
10
11
12
13
- 现有9个苹果,要放入5个不同的盘子,允许有的盘子中放0个苹果,则不同的放法共有( )种。 {{ select(14) }}
720
715
126
252
G
是一个非连通无向图(没有重边和自环),共有36条边,则该图至少有( )个顶点。 {{ select(15) }}
6
9
10
8
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(1)
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 using i64 = long long;
05
06 int popcount(i64 x) {
07 int res = 0;
08 while (x) {
09 if (x & 1 == 1)
10 res++;
11 x >>= 1;
12 }
13 return res;
14 }
15
16 int calc(i64 x) {
17 int sum = 0;
18 for (i64 i = 1; i <= x; i++)
19 sum += popcount(i);
20 return sum;
21 }
22
23 int sum(i64 l, i64 r) {
24 return calc(r) - calc(l);
25 }
26
27 int main() {
28 i64 l, r;
29 cin >> l >> r;
30 cout << calc(r) << " " << sum(l, r) << endl;
31 return 0;
32 }
判断题
- 若程序输入为
5 8
,则程序输出7 6
。( ) {{ select(16) }}
- 正确
- 错误
- 若将第9行中的
&
符号改为^
符号,程序输出结果一定不会改变。( ) {{ select(17) }}
- 正确
- 错误
- 若将头文件
#include <bits/stdc++.h>
改成#include <stdio.h>
,程序仍能正常运行。( ) {{ select(18) }}
- 正确
- 错误
选择题
- 若输入为
1 12
,则输出是什么?( ) {{ select(19) }}
1 21
1 20
1 22
2 22
- 程序中的
sum
函数实现了什么功能?( ) {{ select(20) }}
- 计算了
[L, R]
区间内的每个数二进制位上1
的个数之和 - 计算了
[L, R]
区间内的每个数二进制位上0
的个数之和 - 计算了
(L, R]
区间内的每个数二进制位上1
的个数之和 - 计算了
(L, R]
区间内的每个数二进制位上0
的个数之和
(2)
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 const int inf = 0x3f3f3f3f;
05
06 int solve(vector<int> &cur) {
07 int n = cur.size();
08 vector<vector<int>> dp(n + 1, vector<int>(n + 1, inf));
09 for (int i = 0; i <= n; i++)
10 dp[0][i] = dp[i][0] = 0;
11 for (int i = 1; i <= n; i++)
12 dp[i][i] = cur[i - 1];
13 for (int i = 1; i <= n; i++)
14 for (int j = 1; j <= n; j++)
15 if (i != j)
16 dp[i][j] = min(dp[i][j], dp[i - 1][j] + dp[i][j - 1]);
17 int ans = 0;
18 for (int i = 1; i <= n; i++)
19 ans = max(ans, dp[n][i]);
20 return ans;
21 }
22
23 int main() {
24 int n;
25 cin >> n;
26 vector<int> cost(n);
27 for (int i = 0; i < n; i++)
28 cin >> cost[i];
29 cout << solve(cost) << endl;
30 return 0;
31 }
判断题
- 若输入为
3 1 2 3
,则输出为3
。( ) {{ select(21) }}
- 正确
- 错误
- 计算
dp
数组的时间复杂度为O(n^2)
。( ) {{ select(22) }}
- 正确
- 错误
- 若将第26行改为
vector<int> cost(n + 1)
,则当输入3 1 2 3
时,solve
函数中的n = 3
。( ) {{ select(23) }}
- 正确
- 错误
选择题
- 当输入的
cost
数组为[4, 0, 0, 5, 6]
时,程序的输出为( )。 {{ select(24) }}
23
25
24
22
- 若将第16行改为
dp[i][j] = min(dp[i][j], dp[i - 1][j] - dp[i][j - 1]);
,则当输入的cost
数组为[4, 0, 0, 5, 6]
时,程序的输出为( )。 {{ select(25) }}
20
21
22
23
- 当输入的
cost
数组为[4, 0, 0, 5, 6]
时,在solve
函数中,dp[2][3]
的值为( )。 {{ select(26) }}
1
2
3
4
(3)
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 int func(int a, int b) {
05 if (a == 0)
06 return b;
07 if (b == 0)
08 return a;
09 return a + func(b, a % b);
10 }
11
12 int main() {
13 int x, y;
14 cin >> x >> y;
15 cout << func(x, y) << endl;
16 return 0;
17 }
判断题
- 当输入为
2 3
时,程序的输出为5
。( ) {{ select(27) }}
- 正确
- 错误
- 若输入只有一个为
0
,则程序的输出为输入的另一个数字。( ) {{ select(28) }}
- 正确
- 错误
- 当输入为
6 8
时,func
函数将会被调用4
次。( ) {{ select(29) }}
- 正确
- 错误
选择题
- 当输入为
6 8
时,程序的输出为( )。 {{ select(30) }}
20
21
22
23
- 当输入为
3 5
时,func
函数的调用顺序是( )。 {{ select(31) }}
func(3, 5)—func(5, 3)—func(3, 2)—func(2, 1)—func(1, 0)
func(3, 5)—func(5, 3)—func(3, 2)—func(2, 1)—func(1, 1)—func(1, 0)
func(3, 5)—func(5, 2)—func(2, 1)—func(1, 1)—func(1, 0)
func(3, 5)—func(5, 2)—func(2, 1)—func(1, 0)
- (4分)若将第9行的代码改为
return a + func(b, a - b)
,则当输入为3 5
时,得到的输出为( )。 {{ select(32) }}
14
8
6
- 产生未定义行为,结果未知
三、完善程序(单选题,每小题3分,共计30分)
(1) 题目描述:
给定一个整数数组colors
和一个整数k
,其中colors
表示一个由红色瓷砖和蓝色瓷砖组成的环,第i
块瓷砖的颜色为colors[i]
(1
代表红色,0
代表蓝色)。环中连续k
块瓷砖的颜色如果是交替颜色(除了第一块和最后一块瓷砖以外,中间瓷砖的颜色与它左边瓷砖和右边瓷砖的颜色都不同),那么它被称为一个交替组。现在,请你找出交替组的个数。
01 #include <iostream>
02 #include <①>
03 using namespace std;
04
05 int main() {
06 int n, k;
07 cin >> n >> k;
08 vector<int> colors(n);
09 for (int i = 0; i < n; i++)
10 cin >> colors[i];
11 int ans = 0, cnt = ②;
12 for (int i = 0; i < ③; i++) {
13 if (i > 0 && ④ )
14 cnt = 0;
15 cnt++;
16 ans += ( ⑤ && cnt >= k );
17 }
18 cout << ans << endl;
19 return 0;
20 }
- ①处应填( )。 {{ select(33) }}
vector
set
string
map
- ②处应填( )。 {{ select(34) }}
-1
0
1
2
- ③处应填( )。 {{ select(35) }}
n
n - 1
2 * n
2 * (n - 1)
- ④处应填( )。 {{ select(36) }}
colors[i] == colors[i - 1]
colors[i] != colors[i - 1]
colors[i % n] == colors[(i - 1) % n]
colors[i % n] != colors[(i - 1) % n]
- ⑤处应填( )。 {{ select(37) }}
i > n
i >= n
i < n
i <= n
(2) 题目描述:
在国际象棋中,马的一次移动定义为:垂直移动两个方格后再水平移动一个方格,或者水平移动两个方格后再垂直移动一个方格(两者都形成一个L的形状)。
现在,我们有一个马和一个电话垫(如下所示),马只能站在数字单元格上。你可以将马放置在任何数字单元格上,然后你应该执行n-1
次移动来获得长度为n
的号码。马所有的移动应该是符合规则的有效的移动。马在一次移动的过程中可以经过符号单元格,但必须保证这次移动结束后马站在数字单元格上。
给定一个整数n
,请你计算可以得到多少个长度为n
的数字串。由于答案可能很大,请你输出答案对10^9 + 7
取模后的结果。
01 #include <iostream>
02 #include <vector>
03 using namespace std;
04
05 const int mod = 1e9 + 7;
06 vector<vector<int>> pos = {{4, 6}, {6, 8}, {7, 9}, {4, 8}, {0, 3, 9}, ①, {0, 1, 7}, {2, 6}, {1, 3}, {2, 4}};
07
08 int main() {
09 int n;
10 cin >> n;
11 vector<vector<int>> dp(10, vector<int>(n + 1, 0));
12 for (int i = 0; i < 10; i++)
13 ② = 1;
14 for (int j = 2; j <= n; j++) {
15 for (int i = 0; i < 10; i++) {
16 for (int k = 0; k < pos[i].size(); k++) {
17 dp[i][j] += dp[③][j-1];
18 ④;
19 }
20 }
21 }
22 int ans = 0;
23 for (int i = 0; i < 10; i++) {
24 ⑤;
25 ans %= mod;
26 }
27 cout << ans << endl;
28 return 0;
29 }
- ①处应填( )。 {{ select(38) }}
{1, 3, 7, 9}
{*, #}
{2, 8, 0}
{}
- ②处应填( )。 {{ select(39) }}
dp[i][1]
dp[1][i]
dp[i][0]
dp[0][i]
- ③处应填( )。 {{ select(40) }}
k
pos[k][i]
pos[i][k]
pos[i - 1][k]
- ④处应填( )。 {{ select(41) }}
dp[i][k] %= mod
dp[j][i] -= mod
dp[i][j] %= mod
dp[i][j] -= mod
- ⑤处应填( )。 {{ select(42) }}
ans += dp[i][n]
ans += dp[i][n - 1]
ans += dp[n][i]
ans += dp[n - 1][i]