A. 普及组CSP-J2025初赛模拟卷1
普及组CSP-J2025初赛模拟卷1
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
普及组CSP-J 2025初赛模拟卷1
一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
1. 在标准ASCII码表中,已知英文字母c的ASCII码十进制表示是99,那么英文字母x的ASCII码十六进制表示是( )
{{ select(1) }}
- 77
- 78
- 79
- 7A
2. 以下关于CSP与GESP的描述正确的是( )
{{ select(2) }}
- CSP-J/CSP-S属于非专业级别软件能力认证,只有中小学生才能参加
- CSP-J/CSP-S是中国通信学会举办的程序设计竞赛
- GESP是中国电子学会举办的程序设计竞赛
- GESP C++七级成绩80分及以上或者八级成绩60分及以上,可以申请免CSP-J初赛
3. 以下可以用作C++程序中的变量名的是( )
{{ select(3) }}
- _x1
- new
- class
- public
4. 以下不属于桌面或者手机操作系统的是( )
{{ select(4) }}
- Linux
- Android
- MATLAB
- Windows 11
5. C++中使用输入和输出函数cin和cout会用到( )头文件
{{ select(5) }}
- iostream
- cmath
- cstdio
- algorithm
6. 寻找最短路径的广度优先搜索算法经常用到的数据结构是( )
{{ select(6) }}
- 栈
- 链表
- 向量
- 队列
7. 以下哪个域名后缀不属于中华人民共和国管辖?( )
{{ select(7) }}
- .cn
- .uk
- .hk
- .mo
8. 下列排序算法中,平均情况下( )算法的时间复杂度最小
{{ select(8) }}
- 插入排序
- 选择排序
- 归并排序
- 冒泡排序
9. 关于计算机网络,下面的说法中正确的是( )
{{ select(9) }}
- TCP是网络层协议
- 计算机病毒只能通过U盘等介质传播,不能通过计算机网络传播
- 计算机网络可以实现资源共享
- 公司内部的几台计算机组成的网络规模太小,不能称为计算机网络
10. 序列(7,5,1,12,3,6,9,4)的逆序对有( )个
{{ select(10) }}
- 15
- 12
- 13
- 14
11. 下列属于图像文件格式的是( )
{{ select(11) }}
- MPEG
- DOCX
- JPEG
- WWV
12. 不管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
13. 树的根结点的高度为1,某完全二叉树有2025个结点,其高度是( )
{{ select(13) }}
- 10
- 11
- 12
- 13
14. 现有9个苹果,要放入5个不同的盘子,允许有的盘子中放0个苹果,则不同的放法共有( )种
{{ select(14) }}
- 720
- 715
- 126
- 252
15. G是一个非连通无向图(没有重边和自环),共有36条边,则该图至少有( )个顶点
{{ select(15) }}
- 6
- 9
- 10
- 8
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(1)
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int popcount(i64 x) {
int res = 0;
while(x) {
if(x & 1 == 1)
res++;
x >>= 1;
}
return res;
}
int calc(i64 x) {
int sum = 0;
for(i64 i = 1; i <= x; i++)
sum += popcount(i);
return sum;
}
int sum(i64 l, i64 r) {
return calc(r) - calc(l);
}
int main() {
i64 l, r;
cin >> l >> r;
cout << calc(l) << ' ' << sum(l, r) << endl;
return 0;
}
判断题
- 若程序输入为5 8,则程序输出7 6。( ) {{ select(16) }}
- 正确
- 错误
- 若将第11行中的&符号改为^符号,程序输出结果一定不会改变。( ) {{ 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) }}
- 计算了[1, r]区间内的每个数二进制位上1的个数之和
- 计算了[1, r]区间内的每个数二进制位上0的个数之和
- 计算了(1, r]区间内的每个数二进制位上1的个数之和
- 计算了(1, r]区间内的每个数二进制位上0的个数之和
(2)
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int solve(vector<int> &cur) {
int n = cur.size();
vector<vector<int>> dp(n + 1, vector<int>(n + 1, inf));
for(int i = 0; i <= n; i++)
dp[0][i] = dp[i][0] = 0;
for(int i = 1; i <= n; i++)
dp[i][i] = cur[i - 1];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i != j)
dp[i][j] = min(dp[i][j], dp[i-1][j] + dp[i][j-1]);
int ans = 0;
for(int i = 1; i <= n; i++)
ans = max(ans, dp[n][i]);
return ans;
}
int main() {
int n;
cin >> n;
vector<int> cost(n);
for(int i = 0; i < n; i++)
cin >> cost[i];
cout << solve(cost) << endl;
return 0;
}
判断题
- 若输入为3 1 2 3,则输出为3。( ) {{ select(21) }}
- 正确
- 错误
- 计算dp数组的时间复杂度为O(n²)。( ) {{ select(22) }}
- 正确
- 错误
- 若将第28行改为vector cost(n+1),则当输入3 1 2 3时,solve函数中的n=3。( ) {{ select(23) }}
- 正确
- 错误
选择题
- 当输入的cost数组为[4,0,0,5,6]时,程序的输出为( ) {{ select(24) }}
- 23
- 25
- 24
- 22
- 若将第17行改为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)
#include <bits/stdc++.h>
using namespace std;
int func(int a, int b) {
if(a == 0) return b;
if(b == 0) return a;
return a + func(b, a % b);
}
int main() {
int x, y;
cin >> x >> y;
cout << func(x, y) << endl;
return 0;
}
判断题
- 当输入为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)
- 若将第10行的代码改为return a + func(b, a-b),则当输入为3 5时,得到的输出为( ) {{ select(32) }}
- 14
- 8
- 6
- 产生未定义行为,结果未知
三、完善程序(单选题,每小题3分,共计30分)
(1)
题目描述:
给定一个整数数组colors和一个整数k,其中colors表示一个由红色瓷砖(1)和蓝色瓷砖(0)组成的环。环中连续k块瓷砖的颜色如果是交替颜色(除首尾外,中间瓷砖颜色与左右均不同),则称为一个交替组。请计算交替组的个数。
#include <iostream>
#include <①>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> colors(n);
for(int i = 0; i < n; i++)
cin >> colors[i];
int ans = 0, cnt = ②;
for(int i = 0; i < ③; i++) {
if(i > 0 && ④)
cnt = 0;
cnt++;
ans += (⑤ && cnt >= k);
}
cout << ans << endl;
return 0;
}
- ①处应填( ) {{ 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的数字串总数(答案模10⁹+7)。
键盘布局: 1 2 3 4 5 6 7 8 9
- 0 #
#include <iostream>
#include <vector>
using namespace std;
const int mod = 1E9 + 7;
vector<vector<int>> pos = {
{4, 6}, {6, 8}, {7, 9}, {4, 8}, {0, 3, 9},
①, // 对应数字5的可达位置
{0, 1, 7}, {2, 6}, {1, 3}, {2, 4}
};
int main() {
int n;
cin >> n;
vector<vector<int>> dp(10, vector<int>(n + 1, 0));
for(int i = 0; i < 10; i++)
② = 1; // 初始化长度为1的情况
for(int j = 2; j <= n; j++) {
for(int i = 0; i < 10; i++) {
for(int k = 0; k < pos[i].size(); k++) {
dp[i][j] += dp[③][j - 1];
④; // 取模操作
}
}
}
int ans = 0;
for(int i = 0; i < 10; i++) {
⑤; // 累加所有起点长度为n的方案
ans %= mod;
}
cout << ans << endl;
return 0;
}
- ①处应填( ) {{ 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]