#SCP2022J1. 2022 LUOGU 非专业级别编程能力认证第一轮(SCP-J1)入门级 C++
2022 LUOGU 非专业级别编程能力认证第一轮(SCP-J1)入门级 C++
考生注意事项
- 试题纸共有 12 页,答题纸共有 1 页,满分 100 分。请在答题纸上作答,写在试题纸上的一律无效。
- 不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
- ( )。 {{ select(1) }}
- 若逻辑变量 为真, 为假,以下逻辑表达式的值为假的是( )。 {{ select(2) }}
- 小恺编写了如下函数,希望计算斐波那契数列 第 项对 取余数的值:

在运行空间限制 128 MB、栈空间不超过空间限制、运行时限 1 秒的情况下,在主函数中运行函数 f(12345),则最有可能首先发生什么问题?
{{ select(3) }}
- 运行时间超时
- 栈溢出
- 访问无效内存
- 返回错误的答案
- 表达式
a+b*(c-d)/e-f的后缀表达式为( )。 {{ select(4) }}
-+a/*b-c-cdefabcd-*e/+f-+ab*-cd/e-ff-e/d-d*b+a
- 某个 MV 是一段时长 4 分整的视频文件。它每秒播放 10 帧图像,每帧图像是一幅分辨率为 像素(长宽比 )的 32 位真彩色图像,其画面没有被压缩。这个视频没有音频。这个视频文件大约需要占用多大的存储空间? {{ select(5) }}
- 21 GiB
- 27 GiB
- 168 GiB
- 2 GiB
- 下图是一棵二叉树,它的后序遍历是( )。

{{ select(6) }}
ABDEFCDBEFACDFEBCAABCDEF
- 五个本质不同的点在没有重边或者自环的情况下,组成不同的无向图的个数是( )? {{ select(7) }}
- 10
- 1024
- 15
- 120
- 设元素 依次入栈,则下列不合法的出栈序列为( )? {{ select(8) }}
d,c,b,e,f,af,e,d,c,b,ac,d,f,e,b,ae,d,b,a,f,c
- 同时扔出 3 枚完全相同的六面骰子,每个骰子上有 1 到 6 的数字。将得到的点数排序后,有( )种不同的结果? {{ select(9) }}
- 208
- 56
- 216
- 120
- 在编程时(使用任一种高级语言,不一定是 C++),如果需要从磁盘文件中输入一个很大的二维数组(例如 的
double型数组),按行读(即外层循环是关于行的)与按列读(即外层循环是关于列的)相比,在输入效率上( )。 {{ select(10) }}
- 没有区别
- 按行读的方式更高
- 按列读的方式更高
- 取决于数组的存储方式
- 不考虑稳定性,下列排序方法中平均时间复杂度最大的是( )。 {{ select(11) }}
- 插入排序
- 希尔排序
- 归并排序
- 快速排序
- 将数组
12,23,-1,19,117,-103,79,602中的元素按从大到小的顺序排列,每次可以交换任意两个元素,最少需要交换( )次。 {{ select(12) }}
- 4
- 5
- 6
- 7
- 3 名男生和 3 名女生围成一个圈,男生和男生不相邻,女生和女生不相邻。如果两个围成的圈经过旋转可以重合,则视为同一种方案。请问一共有几种方案? {{ select(13) }}
- 18
- 15
- 12
- 9
- 以下关于 C++ 字符串的说法,错误的是( )。 {{ select(14) }}
- 定义
string类型的字符串时,不需要预先确定它的最大长度。 - 字符数组和
string类型的字符串是可以相互转化的。 - 定义字符数组
char a[100]时并从键盘读入字符串,则读入的字符串长度不能超过 99。 - 定义一个字符串
string s后,获得它长度的方式就是strlen(s)。
- 中国计算机协会成立于( )年。 {{ select(15) }}
- 1961
- 1962
- 1971
- 1972
二、阅读程序(除特殊说明外,判断题 2 分,选择题 3 分,共计 40 分)
程序输入不超过数组或字符串定义的范围。判断题选择“正确”或“错误”。
第一题


已知 ,。完成下面的判断题和单选题。
判断题
solve2函数实现了选择排序。 {{ select(16) }}
- 正确
- 错误
solve1函数的时间复杂度为 ,其中 指的是 的最大值。 {{ select(17) }}
- 正确
- 错误
- 当输入数据为
7 2 3 5 7 1 4 6时,solve2函数中的变量cnt最终值为 9。 {{ select(18) }}
- 正确
- 错误
- 若将
solve2函数中的双斜杠全部移除,不会影响输出结果。 {{ select(19) }}
- 正确
- 错误
单选题
- 下列哪组数据,会使得
solve1函数与solve2函数的输出结果不同?(假设已经输入了 。) {{ select(20) }}
1 10 100 1000 10000 888 8888 888886321 158987 16305 68486 50556 847 156505 15610777 888 999 888 777 888 999 666999993 999994 999995 999996 999997 999998 999999 1000000
- 若要使得
solve1和solve2函数的输出结果相同,则应当修改程序中的哪一处? {{ select(21) }}
- ①
- ②
- ③
- ④
第二题

输入保证 t 的长度不大于 s 的长度,且两字符串均只含有大小写字母,不是空串,type=1,2,3。完成下面的判断题和单选题。
判断题
- 将程序中所有的小于号
<改为不等于号!=,则程序对所有符合要求的输入的输出结果不变。 {{ select(22) }}
- 正确
- 错误
- 当输入为
1 xyz abcd时,程序的输出为xyzd。 {{ select(23) }}
- 正确
- 错误
- 程序在输入为
1 xyz abcd时的输出与输入为2 xyz abcd时的输出相同。 {{ select(24) }}
- 正确
- 错误
- 将程序第 25~28 行的
while循环替换为do-while循环(判断条件和循环体不变),则程序对同一合法输入的输出结果一定不变。 {{ select(25) }}
- 正确
- 错误
单选题
- (2 分)若将程序第 13 行改为
for (int i = 0; i < strlen(t); ++i) s[i] = t[i];,且已知输入的type一定为 1,用 表示s的长度, 表示t的长度,则程序的时间复杂度为( )。 {{ select(26) }}
- 给程序分别输入选项( )的两组输入数据,得到的输出不同。 {{ select(27) }}
1 ab abc和3 ab abc1 AB ABC和3 AB ABC1 de fgh和3 de fgh1 DE FGH和3 DE FGH
第三题



以下程序的输入数据的绝对值均不超过 。完成下面的判断题和单选题。
判断题
- 存在一种合法的输入数据,使得运行程序时,某次
find_down函数的返回值是 。 {{ select(28) }}
- 正确
- 错误
- 该程序的时间复杂度为 。 {{ select(29) }}
- 正确
- 错误
- 对于任意 ,“先执行
front_rotate(u),再执行right_rotate(u)”,与“先执行right_rotate(u),再执行front_rotate(u)”,最终 的值相同。 {{ select(30) }}
- 正确
- 错误
单选题
- 将
anchorX、anchorY、anchorZ依次更换为( )时,对于全部合法数据,与改变之前的输出结果无异。 {{ select(31) }}
Left、Front、DownLeft、Up、FrontLeft、Down、BackDown、Right、Front
- (2 分)对于以下输入数据,输出结果为( )。
5 5
2 8 15 1 10
5 19 19 3 5
6 6 2 8 2
12 16 3 8 17
12 5 3 14 13
1 1 1 1 1 1
{{ select(32) }}
- 95
- 97
- 94
- 103
- (2 分)对于以下输入数据,输出结果为( )。
2 5
2 8 15 3 10
5 19 19 3 5
1 2 3 4 5 6
{{ select(33) }}
- 194
- 157
- 193
- 201
三、完善程序(单选题,每小题 3 分,共计 30 分)
第一题:支付问题
有 种纸币,其中第 种纸币的面值为 元。每种纸币只有一张。求能支付多少种金额(不包括 0 元)。数据范围满足 , 的总和不超过 5000。
试补全程序。

- ① 处应填( )。 {{ select(34) }}
n += a[i]m += a[i]n = a[i]m = a[i]
- ② 处应填( )。 {{ select(35) }}
f[0] = 1f[1] = 1a[0] = 1a[1] = 1
- ③ 处应填( )。 {{ select(36) }}
for (int j = a[i]; j <= n; j++)for (int j = n; j >= a[i]; j--)for (int j = a[i]; j <= m; j++)for (int j = m; j >= a[i]; j--)
- ④ 处应填( )。 {{ select(37) }}
f[j - 1] + 1f[j - a[i]] + 1f[j] || f[j - a[i]]f[j] && f[j - a[i]]
- ⑤ 处应填( )。 {{ select(38) }}
f[i]f[i - 1]f[i] == f[i + 1]f[i] == f[i - 1]
第二题:凑出 17
给定 个互不相同的正整数 ,将之排成一行。你需要在每个 前加上一个加号 + 或减号 -,使这 个数字组成一个算式。请问是否存在一种添加符号的方案,使该算式的值为 17?如果存在,请输出 Yes,否则输出 No。
例如,给定 ,则 。
提示:使用穷举法解决这个问题。
试补全程序。


- ① 处应填( )。 {{ select(39) }}
(s >> p) & 1(s << p) & 1s & (1 << p) & 1s & (1 >> p) & 1
- ② 处应填( )。 {{ select(40) }}
int i = 0; i <= n; ++iint i = 1; i <= n; ++iint i = 0; i < n; ++iint i = 1; i < n; ++i
- ③ 处应填( )。 {{ select(41) }}
1 << n(1 << n) | 1(1 << n) + 1(1 << n) - 1
- ④ 处应填( )。 {{ select(42) }}
int sum = 0unsigned long long sum = 0unsigned short sum = 0unsigned int sum = 0
- ⑤ 处应填( )。 {{ select(43) }}
sum = a[j] + sumsum = a[j] - sumsum = -a[j] + sumsum = -a[j] - sum