CSP 2025 入门级第一轮
CSP 2025 入门级第一轮
- 场次:2025年9月
- 考试时长:120 分钟
- 满分:100 分
- 题目来源:第三方来源(社区转写,非官方,仅供参考)
单项选择题
本分区标题为平台补的结构性占位,原卷(来源件)未收录。
一个 32 位无符号整数可以表示的最大值,最接近下列哪个选项?
在 C++ 中,执行 int x = 255; cout << (x & (x - 1)); 后,输出的结果是?
函数 calc(n) 的定义如下,则 calc(5) 的返回值是多少?( )
int calc(int n) {
if (n <= 1) return 1;
if (n % 2 == 0) return calc(n / 2) + 1;
else return calc(n - 1) + calc(n - 2);
}
用 5 个权值 10,12,15,20,25 构造哈夫曼树,该树的带权路径长度是多少?
在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于?
从 5 位男生和 4 位女生中选出 4 人组成一个学习小组,要求学习小组中男生和女生都有。有多少种不同的选法?
假设 a,b,c 都是布尔变量,逻辑表达式 (a && b) || (!c && a) 的值与下列哪个表达式不始终相等?
已知 f[0]=1, f[1]=1,并且对于所有 n≥2 有 f[n]=(f[n−1]+f[n−2])%7。那么 f[2025] 的值是多少?
下列关于 C++ string 类的说法,正确的是?
考虑以下 C++ 函数:
void solve(int &a, int b) {
a = a + b;
b = a - b;
a = a - b;
}
int main() {
int x = 5, y = 10;
solve(x, y);
}
在 main 函数调用 solve 后,x 和 y 的值分别是?
一个 8×8 的棋盘,左上角坐标为 (1,1),右下角为 (8,8)。一个机器人从 (1,1) 出发,每次只能向右或向下走一格。要到达 (4,5),有多少种不同的路径?
某同学用冒泡排序对数组 {6,1,5,2,4} 进行升序排序,请问需要进行多少次元素交换?
十进制数 72010 和八进制数 2708 的和用十六进制表示是多少?
一棵包含 1000 个结点的完全二叉树,其叶子结点的数量是多少?
给定一个初始为空的整数栈 S 和一个空的队列 P。我们按顺序处理输入的整数队列 A:7,5,8,3,1,4,2。对于队列 A 中的每一个数,执行以下规则:如果该数是奇数,则将其压入栈 S;如果该数是偶数,且栈 S 非空,则弹出一个栈顶元素,并加入到队列 P 的末尾;如果该数是偶数,且栈 S 为空,则不进行任何操作。当队列 A 中的所有数都处理完毕后,队列 P 的内容是什么?
阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 A,错误填 B;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
判断题正确填 A,错误填 B
整组作答后提交批改,成绩计入掌握度 · 已答 0/6
原卷作答说明:判断题正确填 A,错误填 B
#include <algorithm>2#include <cstdio>3#include <cstring>4inline int gcd(int a, int b) {5 if (b == 0)6 return a;7 return gcd(b, a % b);8}9int main() {10 int n;11 scanf("%d", &n);12 int ans = 0;13 for (int i = 1; i <= n; ++i) {14 for (int j = i + 1; j <= n; ++j) {15 for (int k = j + 1; k <= n; ++k) {16 if (gcd(i, j) == 1 && gcd(j, k) == 117 && gcd(i, k) == 1) {18 ++ans;19 }20 }21 }22 }23 printf("%d\n", ans);24 return 0;25}- 16判断1 分
(1 分)当输入为 2 时,程序并不会执行第 16 行的判断语句。( )
- 17判断1.5 分
将第 16 行中的
&& gcd(i,k)==1删去不会影响程序运行结果。( ) - 18判断1.5 分
当输入的 n≥3 的时候,程序总是输出一个正整数。( )
- 19单选3 分
将第 7 行的
gcd(b, a%b)改为gcd(a, a%b)后,程序可能出现的问题是( )。 - 20单选3 分
当输入为 8 的时候,输出为( )。
- 21单选3 分
调用 gcd(36,42) 会返回( )。
整组作答后提交批改,成绩计入掌握度 · 已答 0/6
原卷作答说明:判断题正确填 A,错误填 B
#include <algorithm>2#include <cstdio>3#include <cstring>4#define ll long long5int n, k;6int a[200007];7int ans[200007];8int main() {9 scanf("%d%d", &n, &k);10 for (int i = 1; i <= n; ++i) {11 scanf("%d", &a[i]);12 }13 std::sort(a + 1, a + n + 1);14 n = std::unique(a + 1, a + n + 1) - a - 1;15 for (int i = 1, j = 0; i <= n; ++i) {16 for (; j < i && a[i] - a[j + 1] > k; ++j)17 ;18 ans[i] = ans[j] + 1;19 }20 printf("%d\n", ans[n]);21 return 0;22}- 22判断1.5 分
当输入为
3 1 3 2 1时,输出结果为 2。( ) - 23判断1.5 分
假设输入的 n 为正整数,输出的答案一定小于等于 n,大于等于 1。( )
- 24判断1.5 分
将第 14 行的
n = std::unique(a + 1, a + n + 1) - a - 1;删去后,有可能出现与原本代码不同的输出结果。( ) - 25单选3 分
假设输入的 a 数组和 k 均为正整数,执行第 18 行代码时,一定满足的条件不包括( )。
- 26单选3 分
当输入的 n=100、k=2、a={1,2,…,100} 时,输出为( )。
- 27单选3 分
假设输入的 a 数组和 k 均为正整数,但 a 数组不一定有序,则若误删去第 13 行的
std::sort(a + 1, a + n + 1);,程序有可能出现的问题有( )。
整组作答后提交批改,成绩计入掌握度 · 已答 0/5
原卷作答说明:判断题正确填 A,错误填 B
#include <algorithm>2#include <cstdio>3#include <cstring>4#define ll long long5int f[5007][5007];6int a[5007], b[5007];7int n;8int main() {9 scanf("%d", &n);10 for (int i = 1; i <= n; ++i) {11 scanf("%d", &a[i]);12 }13 for (int i = 1; i <= n; ++i) {14 scanf("%d", &b[i]);15 }16 for (int i = 1; i <= n; ++i) {17 for (int j = 1; j <= n; ++j) {18 f[i][j] = std::max(f[i][j], std::max(f[i - 1][j], f[i][j - 1]));19 if (a[i] == b[j]) {20 f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1);21 }22 }23 }24 printf("%d\n", f[n][n]);25 return 0;26}- 28判断1.5 分
当输入
4 1 2 3 4 1 3 2 2时,输出为 2。( ) - 29判断1.5 分
当程序运行完毕后,对于所有的 1≤i,j≤n,都一定有 f[i][j]≤f[n][n]。( )
- 30判断1.5 分
将第 18 行的
f[i][j] = std::max(f[i][j], std::max(f[i-1][j], f[i][j-1]));删去后,并不影响程序运行结果。( ) - 31单选3 分
输出的答案满足的性质有( )。
- 32单选3 分
如果在 16 行的循环前加上以下两行:
std::sort(a+1, a+n+1); std::sort(b+1, b+n+1);则答案会( )。
三、完善程序(单选题,每小题 3 分,共计 30 分)
整组作答后提交批改,成绩计入掌握度 · 已答 0/5
(1)(字符串解码)“行程长度编码”(Run-Length Encoding)是一种无损压缩算法,常用于压缩重复字符较多的数据,以减少存储空间。假设原始字符串不包含数字字符。压缩规则如下:i) 如果原始字符串中一个字符连续出现 N 次(N≥2),在压缩字符串中它被表示为“字符 + 数字 N”。例如,编码 A12 代表 12 个连续的字符 A。ii) 如果原始字符串中一个字符只出现 1 次,在压缩字符串中它就表示为该字符本身。例如,编码 B 代表 1 个字符 B。
以下程序实现读取压缩字符串并输出其原始的、解压后的形式。试补全程序。
#include <cctype>2#include <iostream>3#include <string>4using namespace std;56int main() {7 string z;8 cin >> z;9 string s = "";1011 for (int i = 0; i < z.length(); ) {12 char ch = z[i];1314 if (__①__ && isdigit(z[i + 1])) {15 i++;16 int count = 0;17 while (i < z.length() && isdigit(z[i])) {18 count = __②__;19 i++;20 }21 for (int j = 0; j < __③__; ++j) {22 s += ch;23 }24 } else {25 s += __④__;26 __⑤__;27 }28 }2930 cout << s << endl;31 return 0;32}- 33(①)单选空位 ①3 分
①处应填( )
- 34(②)单选空位 ②3 分
②处应填( )
- 35(③)单选空位 ③3 分
③处应填( )
- 36(④)单选空位 ④3 分
④处应填( )
- 37(⑤)单选空位 ⑤3 分
⑤处应填( )
整组作答后提交批改,成绩计入掌握度 · 已答 0/5
(2)(精明与糊涂)有 N 个人,分为两类:
i) 精明人:永远能正确判断其他人是精明还是糊涂;
ii)糊涂人:判断不可靠,会给出随机的判断。
已知精明人严格占据多数,即如果精明人有 k 个,则满足 k>N/2。
你只能通过函数 query(i,j) 让第 i 个人判断第 j 个人:返回 true 表示判断结果为“精明人”;返回 false 表示判断结果为“糊涂人”。你的目标是,通过这些互相判断,找出至少一个百分之百确定的精明人。同时,你无需关心 query(i,j) 的内部实现。
以下程序利用“精明人占多数”的优势。设想一个“消除”的过程,让人们互相判断并进行抵消。经过若干轮抵消后,最终留下的候选人必然属于多数派,即精明人。
例如,假设有三人 0,1,2。如果 0 说 1 是糊涂人,而 1 也说 0 是糊涂人,则 0 和 1 至少有一个是糊涂人。程序将同时淘汰 0 和 1。由于三人里至少有两个精明人,我们确定 2 是精明人。
试补全程序。
#include <iostream>2#include <vector>3using namespace std;45int N;6bool query(int i, int j);78int main() {9 cin >> N;1011 int candidate = 0;12 int count = __①__;13 for (int i = 1; i < N; ++i) {14 if (__②__) {15 candidate = i;16 count = 1;17 } else {18 if (__③__) {19 __④__;20 } else {21 count++;22 }23 }24 }25 cout << __⑤__ << endl;26 return 0;27}- 38(①)单选空位 ①3 分
①处应填( )
- 39(②)单选空位 ②3 分
②处应填( )
- 40(③)单选空位 ③3 分
③处应填( )
- 41(④)单选空位 ④3 分
④处应填( )
- 42(⑤)单选空位 ⑤3 分
⑤处应填( )