#SCP2024J1. 2024 LUOGU 非专业级别收容能力认证第一轮(SCP-J1)入门级 C++ 语言试题
2024 LUOGU 非专业级别收容能力认证第一轮(SCP-J1)入门级 C++ 语言试题
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
- C++ 是一种面向对象的程序设计语言。在 C++ 中,下面哪个关键字用于声明一个类,其缺省继承方式为
private继承?( )
{{ select(1) }}
unionstructclassenum
- 下述代码实现的数据结构是( )。
int data[100], f = 1, r;
void insert(int value) {
data[++r] = value;
}
void pop() {
f++;
}
{{ select(2) }}
- 链表
- 栈
- 队列
- 平衡树
- C++ 语言中,以
0b开头的数为( )进制数。
{{ select(3) }}
- 二进制
- 八进制
- 十进制
- 十六进制
- 根结点的高度为 1,高度为 5 的完全二叉树至少有( )个结点。
{{ select(4) }}
- 15
- 16
- 31
- 32
- 右图所示的二叉树,其后序遍历的结果是什么?( )

{{ select(5) }}
acedgbffbacdgeedgcabfegdcfba
- 考虑右图所示的数字电路,有关逻辑门的含义已在图中标出。高电平表示
true,低电平表示false。当 的输入依次为低电平、高电平、高电平时,输出为( )。

{{ select(6) }}
- 高电平
- 低电平
- 电路故障
- 高阻
- 十进制数 转换为八进制数的结果为( )。
{{ select(7) }}
10.510.312.512.3
- 假设有一组字符
{g,h,i,j,k,l},它们对应的频率分别为 。请问以下哪个选项是字符 分别对应的一组哈夫曼编码?( )
{{ select(8) }}
g: 1100, h: 1101, i: 111, l: 10, k: 00, j: 01g: 0000, h: 001, i: 010, l: 011, k: 10, j: 11g: 111, h: 110, i: 101, l: 100, k: 01, j: 00g: 110, h: 111, i: 101, l: 100, k: 0, j: 01
- 中缀表达式
((6 - 3) * 2 + 7) / (5 ^ (3 * 4 + 2))对应的后缀表达式为( )。
{{ select(9) }}
/ + * - 6 3 2 7 ^ 5 + * 3 4 26 3 2 - * 7 + 5 3 4 * 2 + ^ /6 3 - 2 * 7 + 5 3 4 * 2 + ^ /6 3 - 2 * 7 + 3 4 * 2 + 5 ^ /
- 将 3 个相同的红球和 3 个相同的黑球装入三个不同的袋中,每袋均装 2 个球,则不同的装法总数为( )。
{{ select(10) }}
- 7
- 8
- 9
- 10
- 从 2 至 8 的 7 个整数中随机取 2 个不同的数,这两个数互质的概率为( )。
{{ select(11) }}
- 以下哪一种算法典型地使用了分治法的思想来解决问题?( )
{{ select(12) }}
- 线性搜索
- 快速排序
- 冒泡排序
- 插入排序
- 奇偶校验编码是常见的校验编码方式。对于二进制编码 ,奇偶校验编码在编码的最后增加一位校验位 ,并将原编码与校验位作为整体发送。校验位分为奇校验位与偶校验位:奇校验位保证
偶校验位保证
$$A_n\mathbin{\mathrm{xor}}A_{n-1}\mathbin{\mathrm{xor}}\cdots\mathbin{\mathrm{xor}}A_2\mathbin{\mathrm{xor}}A_1\mathbin{\mathrm{xor}}G=0.$$下列编码与校验位对应正确的是( )。
{{ select(13) }}
- 编码
11100111,奇校验位0 - 编码
01100010,偶校验位0 - 编码
00010010,奇校验位1 - 编码
11100010,偶校验位1
- 下列关于 NOI 系列活动的有关说法,错误的是( )。
{{ select(14) }}
- NOI 考试对 C++ 语言的使用没有限制。
- 选手不可以携带草稿纸、手机、U 盘等进入考场。
- 主办单位 CCF 的全称为中国计算机学会。
- 在 CSP 第一轮考试中舞弊,可能会被给予取消考试资格、禁赛等处罚。
- 考虑右图所示的无向图,度最大的结点为( )号结点。

{{ select(15) }}
- 3
- 4
- 5
- 6
二、阅读程序(判断题正确选“正确”,错误选“错误”;除特殊说明外,判断题每题 1.5 分,选择题每题 3 分,共计 40 分)
阅读程序(1)
01 #include <bits/stdc++.h>
02 using namespace std;
03 int x, y;
04 unsigned int n;
05 int main() {
06 cin >> n >> x >> y;
07 unsigned int mask = 0xff;
08 int x8 = x << 3;
09 int y8 = y << 3;
10 unsigned int nx = (n >> x8) & mask, ny = (n >> y8) & mask;
11 n &= (~(mask << x8));
12 n &= (~(mask << y8));
13 n |= (nx << y8);
14 n |= (ny << x8);
15 cout << "0x";
16 cout << std::hex << n << endl;
17 return 0;
18 }
假设输入的 是 32 位无符号整数范围内的整数, 是不超过 3 的自然数,完成下面的判断题和单选题。
- 代码中
mask变量的值转化为二进制的低 16 位结果是0000 0000 1111 1111。( )
{{ select(16) }}
- 正确
- 错误
- 当输入 的时候,
nx表示 中最低八位对应的字节的数据。( )
{{ select(17) }}
- 正确
- 错误
- 去掉程序第 11 行至第 12 行中
(~(mask << x8))和(~(mask << y8))两处中的最内层括号不会改变程序的结果。( )
{{ select(18) }}
- 正确
- 错误
- 当输入为
15078 0 1时,变量nx,ny的值分别为多少?( )
提示:十进制数 15078 与十六进制数 3AE6 相同。
{{ select(19) }}
0xE6, 0x3A0x6, 0xE00x6, 0xE0x6, 0xA
- 当输入为
23270 0 1时,输出为( )。
提示:十进制数 23270 与十六进制数 5AE6 相同。
{{ select(20) }}
0x5A6E0x5E6A0xA56E0xE65A
- 以下哪一个变量的类型修改可能影响程序的输出?( )
{{ select(21) }}
- 将
x,y修改为unsigned int类型。 - 将
x8,y8修改为short类型。 - 将
mask修改为int类型。 - 将
nx,ny修改为unsigned long long类型。
阅读程序(2)
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 int n, k;
05
06 int func(vector <int> &nums) {
07 int ret = 0;
08 for(int i = n; i > k; i--) {
09 if(nums[i] > nums[i - k]) {
10 swap(nums[i], nums[i - k]);
11 ret++;
12 }
13 }
14 return ret;
15 }
16
17 int main() {
18 cin >> n >> k;
19 vector <int> a(n + 1, 0);
20 for(int i = 1; i <= n; i++)
21 cin >> a[i];
22 int counter = 0, previous = -1;
23 while(counter != previous){
24 previous = counter;
25 counter += func(a);
26 }
27 for(int i = 1; i <= n; i++)
28 cout << a[i] << ",";
29 cout << endl << counter << endl;
30 return 0;
31 }
假设输入的 是不超过 100000 的正整数,输入的 是不超过 的整数, 小于等于 ,完成下面的判断题和单选题。
- 当输入的 为 1,程序将 从小到大排序。( )
{{ select(22) }}
- 正确
- 错误
- 在题目限制的输入规模下,
counter可能会溢出。( )
{{ select(23) }}
- 正确
- 错误
- **(1 分)**当输入为
8 1 1 9 2 3 4 6 8 7,输出共有 18 个可见字符。( )
{{ select(24) }}
- 正确
- 错误
- 当输入的 为 1,该程序的排序方法最接近( )。
{{ select(25) }}
- 冒泡排序
- 选择排序
- 计数排序
- 插入排序
- 该程序的时间复杂度为( )。
{{ select(26) }}
- 当输入为
8 3 1 5 2 6 3 7 4 8,输出的第一行第三个数字为( )。
{{ select(27) }}
- 2
- 6
- 7
- 8
阅读程序(3)
01 #include <iostream>
02 #include <vector>
03 #include <queue>
04 using namespace std;
05 const int MAXN = 200001;
06 int main() {
07 int n, m, l, r, w;
08 cin >> n >> m;
09 vector <int> dist(MAXN, -1);
10 vector <bool> vis(MAXN, false);
11 vector <vector <pair<int, int> > > go(MAXN);
12 for(int i = 1; i <= m; i++) {
13 cin >> l >> r >> w;
14 go[l].push_back(make_pair(r + 1, w));
15 go[r + 1].push_back(make_pair(l, -w));
16 }
17 queue <int> q;
18 dist[1] = 0, vis[1] = true;
19 q.push(1);
20 while(!q.empty()) {
21 int x = q.front(); q.pop();
22 for(auto i : go[x]) {
23 if(!vis[i.first]) {
24 vis[i.first] = true;
25 dist[i.first] = dist[x] + i.second;
26 q.push(i.first);
27 }
28 }
29 }
30 if(dist[n + 1] == -1) cout << "sorry" << endl;
31 else cout << dist[n + 1] << endl;
32 return 0;
33 }
假设输入的 是不超过 200000 的正整数,程序第 13 行每次输入的 保证 ,完成下面的判断题和单选题。
- 交换程序的第 14 行与第 15 行,不影响程序运行的结果。( )
{{ select(28) }}
- 正确
- 错误
- 输入的 的最大值为 时,程序可以正常运行。( )
{{ select(29) }}
- 正确
- 错误
- 在程序的第 17 行至第 29 行,相同的数可能重复进入队列。( )
{{ select(30) }}
- 正确
- 错误
- 当输入的 最小值为 ,输入的 的最大值为 ,最多有( )个元素进入过队列。
{{ select(31) }}
- 当输入的 为偶数,且 时, 至少为( )时输出不为
sorry。
{{ select(32) }}
- 当输入为
5 3 1 3 4 3 4 2 4 5 3时,输出为( )。
{{ select(33) }}
- 4
- 5
- 6
- 7
三、完善程序(单选题,每小题 3 分,共计 30 分)
(1)优美的进制
给出整数 。 进制是优美的,当且仅当 在 进制下至少有两位,且每一位的数值都不同。求对于给定的 ,有哪些进制是优美的,不存在则输出 -1。
试补全程序。
01 #include <bits/stdc++.h>
02 using namespace std;
03 const int MAXN = 100000;
04 int n;
05 int vis[MAXN], a[MAXN];
06 vector<int> ans;
07 int check(int k) {
08 int x = n, top = 0;
09 for (int i = 0; i <= k; i++) vis[i] = 0;
10 while (①) {
11 a[++top] = ②;
12 x = ③;
13 }
14 if (top < 2)
15 return 0;
16 for (int i = 1; i <= top; i++) {
17 if (④)
18 return 0;
19 vis[a[i]] = 1;
20 }
21 return 1;
22 }
23 int main() {
24 cin >> n;
25 for (int i = ⑤; i <= n; i++) {
26 if (check(i))
27 ans.push_back(i);
28 }
29 if (ans.empty()) {
30 cout << -1;
31 }
32 for (int i = 0; i < ans.size(); i++)
33 cout << ans[i] << " ";
34 return 0;
35 }
- ① 处应填( )。
{{ select(34) }}
x > 0x > 1x / k > 0x / k > 1
- ② 处应填( )。
{{ select(35) }}
x / kx % k(x - 1) / k + 1(x - 1) % k + 1
- ③ 处应填( )。
{{ select(36) }}
x / kx % k(x - 1) / k + 1(x - 1) % k + 1
- ④ 处应填( )。
{{ select(37) }}
vis[i] == 1vis[a[i]] == 0vis[i] == 0vis[a[i]] == 1
- ⑤ 处应填( )。
{{ select(38) }}
1n - 120
(2)好运的日期
一个日期可以用 年 月 日来表示。我们称一个日期是好运的,当且仅当 为质数,其中 为 年 月的总天数。输入 ,判断其对应的日期是否好运。保证 是不超过 2024 的正整数, 是不超过 12 的正整数, 可以构成一个合法的日期。
试补全线性筛法算法,空间限制 512 MiB。
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 const int MAXW = ①;
05 const int days[13] = {0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
06 int prime[MAXW], cnt;
07 bool not_prime[MAXW];
08
09 void linear_prime(int n) {
10 --n;
11 not_prime[0] = not_prime[1] = true;
12 for(int i = 2; i <= n; i++) {
13 if(not_prime[i] == false)
14 prime[++cnt]=i;
15 for(int j = 1; ②; j++) {
16 not_prime[i * prime[j]] = 1;
17 if(i % prime[j] == 0)
18 ③;
19 }
20 }
21 }
22 bool check(int n) {
23 return ④;
24 }
25
26 int main() {
27 linear_prime(MAXW);
28 int x, y, z, w;
29 cin >> x >>y >> z;
30 if(y == ⑤)
31 w = check(x) ? 29 : 28;
32 else
33 w = days[y];
34 if(not_prime[x * y * (w - z + 1)])
35 cout << "unlucky" << endl;
36 else
37 cout << "lucky" << endl;
38 return 0;
39 }
- ① 处可以填( )。
{{ select(39) }}
753005100000000007250412024
- ② 处应填( )。
{{ select(40) }}
j <= cnti * prime[j] <= n(j <= cnt) && (i * prime[j] <= n)(i <= cnt) && (prime[i] * prime[j] <= n)
- ③ 处应填( )。
{{ select(41) }}
not_prime[i] = truereturncontinuebreak
- ④ 处应填( )。
{{ select(42) }}
n % 4 == 0(n % 400 == 0 || (n % 4 == 0 && n % 100 != 0))(n % 4 == 0 && n % 100 != 0)(n % 100 == 0 || (n % 4 == 0 && n % 100 != 0))
- ⑤ 处应填( )。
{{ select(43) }}
1782