CSP-J 2022 第一轮试题
CSP-J 2022 第一轮试题
- 场次:2022年CSP-J第1轮
- 考试时长:120 分钟
- 满分:100 分
- 题目来源:第三方来源(社区转写,非官方,仅供参考)
单项选择题
本分区标题为平台补的结构性占位,原卷(来源件)未收录。
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
以下哪种功能没有涉及 C++ 语言的面向对象特性支持:( )。
有 6 个元素,按照 6,5,4,3,2,1 的顺序进入栈 S,请问下列哪个出栈序列是非法的( )。
运行以下代码片段的行为是( )。
int x = 101;
int y = 201;
int *p = &x;
int *q = &y;
p = q;
链表和数组的区别包括( )。
对假设栈 S 和队列 Q 的初始状态为空。存在 e1∼e6 六个互不相同的数据,每个数据按照进栈 S、出栈 S、进队列 Q、出队列 Q 的顺序操作,不同数据间的操作可能会交错。已知栈 S 中依次有数据 e1、e2、e3、e4、e5 和 e6 进栈,队列 Q 依次有数据 e2、e4、e3、e6、e5 和 e1 出队列。则栈 S 的容量至少是( )个数据。
对表达式 a+(b-c)*d 的前缀表达式为( ),其中 +、-、* 是运算符。
假设字母表 {a,b,c,d,e} 在字符串出现的频率分别为 10%,15%,30%,16%,29%。若使用哈夫曼编码方式对字母进行不定长的二进制编码,字母 d 的编码长度( )位。
一棵有 n 个结点的完全二叉树用数组进行存储与表示,已知根结点存储在数组的第 1 个位置。若存储在数组第 9 个位置的结点存在兄弟结点和两个子结点,则它的兄弟结点和右子结点的位置分别是( )。
考虑由 N 个顶点构成的有向连通图,采用邻接矩阵的数据结构表示时,该矩阵中至少存在( )个非零元素。
以下对数据结构的表述不恰当的一项为:( )。
以下哪组操作能完成在双向循环链表结点 p 之后插入结点 s 的效果(其中,next 域为结点的直接后继,prev 域为结点的直接前驱):( )。
以下排序算法的常见实现中,哪个选项的说法是错误的:( )。
八进制数 32.1 对应的十进制数是( )。
一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串 abcab 有( )个内容互不相同的子串。
以下对递归方法的描述中,正确的是:( )。
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
判断题「√」表示正确,「×」表示错误
整组作答后提交批改,成绩计入掌握度 · 已答 0/6
01 #include <iostream>202303 using namespace std;404505 int main()606 {707 unsigned short x, y;808 cin >> x >> y;909 x = (x | x << 2)& 0x33;1010 x = (x | x << 1)& 0x55;1111 y = (y | y << 2)& 0x33;1212 y = (y | y << 1)& 0x55;1313 unsigned short z = x | y << 1;1414 cout << z << endl;1515 return 0;1616 }- 16判断1.5 分
删去第 7 行与第 13 行的 unsigned,程序行为不变。
- 17判断1.5 分
将第 7 行与第 13 行的 short 均改为 char,程序行为不变。
- 18判断1.5 分
程序总是输出一个整数“0”。
- 19判断1.5 分
当输入为
2 2时,输出为10。 - 20判断1.5 分
当输入为
2 2时,输出为59。 - 21单选3 分
单选题
- 当输入为
13 8时,输出为( )。
- 当输入为
整组作答后提交批改,成绩计入掌握度 · 已答 0/6
1 #include <algorithm>22 #include <iostream>33 #include <limits>44 55 using namespace std;66 77 const int MAXN = 105;88 const int MAXK = 105;99 1010 int h[MAXN][MAXK];1111 1212 int f(int n, int m)1313 {1414 if (m == 1) return n;1515 if (n == 0) return 0;1616 1717 int ret = numeric_limits<int>::max();1818 for (int i = 1; i <= n; i++)1919 ret = min(ret, max(f(n - i,m), f(i - 1, m - 1)) + 1);2020 return ret;2121 }2222 2323 int g(int n, int m)2424 {2525 for (int i = 1;i <= n; i++)2626 h[i][1]= i;2727 for (int j = 1;j<= m; j++)2828 h[0][j]= 0;2929 3030 for (int i= 1; i <= n; i++){3131 for (int j= 2; j <= m; j++){3232 h[i][j] = numeric_limits<int>::max();3333 for (int k = 1;k <= i;k++)3434 h[i][j]= min(3535 h[i][j],3636 max(h[i - k][j],h[k - 1][j - 1]) +1);3737 }3838 }3939 4040 return h[n][m];4141 }4242 4343 int main()4444 {4545 int n,m;4646 cin >> n>> m;4747 cout << f(n, m) << endl << g(n, m)<< endl;4848 return 0;4949 }- 22判断1.5 分
当输入为
7 3时,第 19 行用来取最小值的min函数执行了 449 次。 - 23判断1.5 分
输出的两行整数总是相同的。
- 24判断1.5 分
当 m 为 1 时,输出的第一行总为 n。
- 25单选3 分
单选题
- 算法 g(n,m) 最为准确的时间复杂度分析结果为( )。
- 26单选3 分
当输入为
20 2时,输出的第一行为( )。 - 27单选4 分
(4 分) 当输入
100 100时,输出的第一行为( )。
整组作答后提交批改,成绩计入掌握度 · 已答 0/7
1 #include <iostream>22 33 using namespace std;44 55 int n,k;66 77 int solve1()88 {99 int l = 0, r = n;1010 while(l <= r){1111 int mid = (l + r) / 2;1212 if (mid * mid <= n) l = mid + 1;1313 else r = mid - 1;1414 }1515 return l - 1;1616 }1717 1818 double solve2(double x)1919 {2020 if (x == 0) return x;2121 for (int i = 0; i < k; i++)2222 x = (x + n / x) / 2;2323 return x;2424 }2525 2626 int main()2727 {2828 cin >> n >> k;2929 double ans = solve2(solve1());3030 cout << ans << ' ' << (ans * ans == n) << endl;3131 return 0;3232 }- 28判断1.5 分
该算法最准确的时间复杂度分析结果为 O(logn+k)。
- 29判断1.5 分
当输入为
9801 1时,输出的第一个数为99。 - 30判断1.5 分
对于任意输入的 n,随着所输入 k 的增大,输出的第二个数会变成 1。
- 31判断1.5 分
该程序有存在缺陷。当输入的 n 过大时,第 12 行的乘法有可能溢出,因此应当将
mid强制转换为 64 位整数再计算。 - 32单选3 分
单选题
- 当输入为
2 1时,输出的第一个数最接近( )。
- 当输入为
- 33单选3 分
当输入为
3 10时,输出的第一个数最接近( )。 - 34单选3 分
当输入为
256 11时,输出的第一个数( )。
三、完善程序(单选题,每小题 3 分,共计 30 分)
整组作答后提交批改,成绩计入掌握度 · 已答 0/5
(1)(枚举因数)从小到大打印正整数 n 的所有正因数。
试补全枚举程序。
#include <bits/stdc++.h>2using namespace std;34int main(){5 int n;6 cin >> n;78 vector<int> fac;9 fac.reserve((int)ceil(sqrt(n)));1011 int i;12 for (i = 1; i * i < n; ++i){13 if (①){14 fac.push_back(i);15 }16 }1718 for (int k = 0; k < fac.size(); ++k){19 cout << ② << "";20 }21 if (③) {22 cout << ④ << "";23 }24 for (int k = fac.size() - 1; k >= 0; --k){25 cout << ⑤ << "";26 }27}- 35(①)单选空位 ①3 分
if (①){
- 36(②)单选空位 ②3 分
cout << ② << "";
- 37(③)单选空位 ③3 分
if (③) {
- 38(④)单选空位 ④3 分
cout << ④ << "";
- 39(⑤)单选空位 ⑤3 分
cout << ⑤ << "";
整组作答后提交批改,成绩计入掌握度 · 已答 0/5
现有用字符标记像素颜色的 8×8 图像。颜色填充的操作描述如下:给定起始像素的位置待填充的颜色,将起始像素和所有可达的像素(可达的定义:经过一次或多次的向上、下、左、右四个方向移动所能到达且终点和路径上所有像素的颜色都与起始像素颜色相同),替换为给定的颜色。
试补全程序。
#include<bits/stdc++.h>2using namespace std;34const int ROWS = 8;5const int COLS = 8;67struct Point {8 int r, c;9 Point(int r, int c): r(r), c(c) {}10};1112bool is_valid(char image[ROWS][COLS], Point pt,13 int prev_color, int new_color) {14 int r = pt.r;15 int c = pt.c;16 return (0 <= r && r < ROWS && 0 <= c && c < COLS &&17 ① && image[r][c] != new_color);18}1920void flood_fill(char image[ROWS][COLS], Point cur, int new_color) {21 queue<Point> queue;22 queue.push(cur);2324 int prev_color = image[cur.r][cur.c];25 ②;2627 while (!queue.empty()) {28 Point pt = queue.front ();29 queue.pop ();3031 Point points[4] = {③, Point(pt.r - 1, pt.c),32 Point(pt.r, pt.c + 1), Point(pt.r, pt.c - 1)};33 for (auto p : points) {34 if (is_valid(image, p, prev_color, new_color)) {35 ④;36 ⑤;37 }38 }39 }40}4142int main() {43 char image[ROWS][COLS] = {{'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'},44 {'g', 'g', 'g', 'g', 'g', 'g', 'r', 'r'},45 {'g', 'r', 'r', 'g', 'g', 'r', 'g', 'g'},46 {'g', 'b', 'b', 'b', 'b', 'r', 'g', 'r'},47 {'g', 'g', 'g', 'b', 'b', 'r', 'g', 'r'},48 {'g', 'g', 'g', 'b', 'b', 'b', 'b', 'r'},49 {'g', 'g', 'g', 'g', 'g', 'b', 'g', 'g'},50 {'g', 'g', 'g', 'g', 'g', 'b', 'b', 'g'}};5152 Point cur(4, 4);53 char new_color = 'y';5455 flood_fill(image, cur, new_color);5657 for (int r = 0; r < ROWS; r++) {58 for (int c = 0; c < COLS; c++) {59 cout << image[r][c] << '';60 }61 cout << endl;62 }63//输出:64// g g g g g g g g65// g g g g g g r r66// g r r g g r g g67// g y y y y r g r68// g g g y y r g r69// g g g y y y y r70// g g g g g y g g71// g g g g g y y g7273 return 0;74}- 40(①)单选空位 ①3 分
① && image[r][c] != new_color)
- 41(②)单选空位 ②3 分
int prev_color = image[cur.r][cur.c];
②; - 42(③)单选空位 ③3 分
Point points[4] = {③, Point(pt.r - 1, pt.c),
- 43(④)单选空位 ④3 分
④; - 44(⑤)单选空位 ⑤3 分
⑤;