#SCP2024J1. 2024 LUOGU 非专业级别收容能力认证第一轮(SCP-J1)入门级 C++ 语言试题

2024 LUOGU 非专业级别收容能力认证第一轮(SCP-J1)入门级 C++ 语言试题

一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)

  1. C++ 是一种面向对象的程序设计语言。在 C++ 中,下面哪个关键字用于声明一个类,其缺省继承方式为 private 继承?( )

{{ select(1) }}

  • union
  • struct
  • class
  • enum
  1. 下述代码实现的数据结构是( )。
int data[100], f = 1, r;

void insert(int value) {
    data[++r] = value;
}

void pop() {
    f++;
}

{{ select(2) }}

  • 链表
  • 队列
  • 平衡树
  1. C++ 语言中,以 0b 开头的数为( )进制数。

{{ select(3) }}

  • 二进制
  • 八进制
  • 十进制
  • 十六进制
  1. 根结点的高度为 1,高度为 5 的完全二叉树至少有( )个结点。

{{ select(4) }}

  • 15
  • 16
  • 31
  • 32
  1. 右图所示的二叉树,其后序遍历的结果是什么?( )

{{ select(5) }}

  • acedgbf
  • fbacdge
  • edgcabf
  • egdcfba
  1. 考虑右图所示的数字电路,有关逻辑门的含义已在图中标出。高电平表示 true,低电平表示 false。当 x,y,zx,y,z 的输入依次为低电平、高电平、高电平时,输出为( )。

{{ select(6) }}

  • 高电平
  • 低电平
  • 电路故障
  • 高阻
  1. 十进制数 10.37510.375 转换为八进制数的结果为( )。

{{ select(7) }}

  • 10.5
  • 10.3
  • 12.5
  • 12.3
  1. 假设有一组字符 {g,h,i,j,k,l},它们对应的频率分别为 8%,14%,17%,20%,23%,18%8\%,14\%,17\%,20\%,23\%,18\%。请问以下哪个选项是字符 g,h,i,j,k,lg,h,i,j,k,l 分别对应的一组哈夫曼编码?( )

{{ select(8) }}

  • g: 1100, h: 1101, i: 111, l: 10, k: 00, j: 01
  • g: 0000, h: 001, i: 010, l: 011, k: 10, j: 11
  • g: 111, h: 110, i: 101, l: 100, k: 01, j: 00
  • g: 110, h: 111, i: 101, l: 100, k: 0, j: 01
  1. 中缀表达式 ((6 - 3) * 2 + 7) / (5 ^ (3 * 4 + 2)) 对应的后缀表达式为( )。

{{ select(9) }}

  • / + * - 6 3 2 7 ^ 5 + * 3 4 2
  • 6 3 2 - * 7 + 5 3 4 * 2 + ^ /
  • 6 3 - 2 * 7 + 5 3 4 * 2 + ^ /
  • 6 3 - 2 * 7 + 3 4 * 2 + 5 ^ /
  1. 将 3 个相同的红球和 3 个相同的黑球装入三个不同的袋中,每袋均装 2 个球,则不同的装法总数为( )。

{{ select(10) }}

  • 7
  • 8
  • 9
  • 10
  1. 从 2 至 8 的 7 个整数中随机取 2 个不同的数,这两个数互质的概率为( )。

{{ select(11) }}

  • 1/61/6
  • 1/31/3
  • 1/21/2
  • 2/32/3
  1. 以下哪一种算法典型地使用了分治法的思想来解决问题?( )

{{ select(12) }}

  • 线性搜索
  • 快速排序
  • 冒泡排序
  • 插入排序
  1. 奇偶校验编码是常见的校验编码方式。对于二进制编码 AnAn1A2A1A_nA_{n-1}\ldots A_2A_1,奇偶校验编码在编码的最后增加一位校验位 GG,并将原编码与校验位作为整体发送。校验位分为奇校验位与偶校验位:奇校验位保证
$$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=1,$$

偶校验位保证

$$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
  1. 下列关于 NOI 系列活动的有关说法,错误的是( )。

{{ select(14) }}

  • NOI 考试对 C++ 语言的使用没有限制。
  • 选手不可以携带草稿纸、手机、U 盘等进入考场。
  • 主办单位 CCF 的全称为中国计算机学会。
  • 在 CSP 第一轮考试中舞弊,可能会被给予取消考试资格、禁赛等处罚。
  1. 考虑右图所示的无向图,度最大的结点为( )号结点。

{{ 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  }

假设输入的 nn 是 32 位无符号整数范围内的整数,x,yx,y 是不超过 3 的自然数,完成下面的判断题和单选题。

  1. 代码中 mask 变量的值转化为二进制的低 16 位结果是 0000 0000 1111 1111。( )

{{ select(16) }}

  • 正确
  • 错误
  1. 当输入 x=0x=0 的时候,nx 表示 nn 中最低八位对应的字节的数据。( )

{{ select(17) }}

  • 正确
  • 错误
  1. 去掉程序第 11 行至第 12 行中 (~(mask << x8))(~(mask << y8)) 两处中的最内层括号不会改变程序的结果。( )

{{ select(18) }}

  • 正确
  • 错误
  1. 当输入为 15078 0 1 时,变量 nx,ny 的值分别为多少?( )

提示:十进制数 15078 与十六进制数 3AE6 相同。

{{ select(19) }}

  • 0xE6, 0x3A
  • 0x6, 0xE0
  • 0x6, 0xE
  • 0x6, 0xA
  1. 当输入为 23270 0 1 时,输出为( )。

提示:十进制数 23270 与十六进制数 5AE6 相同。

{{ select(20) }}

  • 0x5A6E
  • 0x5E6A
  • 0xA56E
  • 0xE65A
  1. 以下哪一个变量的类型修改可能影响程序的输出?( )

{{ 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  }

假设输入的 n,kn,k 是不超过 100000 的正整数,输入的 a[i]a[i] 是不超过 10910^9 的整数,kk 小于等于 nn,完成下面的判断题和单选题。

  1. 当输入的 kk 为 1,程序将 aa 从小到大排序。( )

{{ select(22) }}

  • 正确
  • 错误
  1. 在题目限制的输入规模下,counter 可能会溢出。( )

{{ select(23) }}

  • 正确
  • 错误
  1. **(1 分)**当输入为 8 1 1 9 2 3 4 6 8 7,输出共有 18 个可见字符。( )

{{ select(24) }}

  • 正确
  • 错误
  1. 当输入的 kk 为 1,该程序的排序方法最接近( )。

{{ select(25) }}

  • 冒泡排序
  • 选择排序
  • 计数排序
  • 插入排序
  1. 该程序的时间复杂度为( )。

{{ select(26) }}

  • O(n+k2)O(n+k^2)
  • O(n2)O(n^2)
  • O(nk)O(nk)
  • O ⁣(n2k)O\!\left(\dfrac{n^2}{k}\right)
  1. 当输入为 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  }

假设输入的 n,mn,m 是不超过 200000 的正整数,程序第 13 行每次输入的 l,rl,r 保证 lrl\le r,完成下面的判断题和单选题。

  1. 交换程序的第 14 行与第 15 行,不影响程序运行的结果。( )

{{ select(28) }}

  • 正确
  • 错误
  1. 输入的 rr 的最大值为 nn 时,程序可以正常运行。( )

{{ select(29) }}

  • 正确
  • 错误
  1. 在程序的第 17 行至第 29 行,相同的数可能重复进入队列。( )

{{ select(30) }}

  • 正确
  • 错误
  1. 当输入的 ll 最小值为 xx,输入的 rr 的最大值为 yy,最多有( )个元素进入过队列。

{{ select(31) }}

  • 11
  • yxy-x
  • yx+1y-x+1
  • yx+2y-x+2
  1. 当输入的 nn 为偶数,且 r=l+1r=l+1 时,mm 至少为( )时输出不为 sorry

{{ select(32) }}

  • n/2n/2
  • n/2+1n/2+1
  • n/21n/2-1
  • nn
  1. 当输入为 5 3 1 3 4 3 4 2 4 5 3 时,输出为( )。

{{ select(33) }}

  • 4
  • 5
  • 6
  • 7

三、完善程序(单选题,每小题 3 分,共计 30 分)

(1)优美的进制

给出整数 nnkk 进制是优美的,当且仅当 nnkk 进制下至少有两位,且每一位的数值都不同。求对于给定的 nn,有哪些进制是优美的,不存在则输出 -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  }
  1. ① 处应填( )。

{{ select(34) }}

  • x > 0
  • x > 1
  • x / k > 0
  • x / k > 1
  1. ② 处应填( )。

{{ select(35) }}

  • x / k
  • x % k
  • (x - 1) / k + 1
  • (x - 1) % k + 1
  1. ③ 处应填( )。

{{ select(36) }}

  • x / k
  • x % k
  • (x - 1) / k + 1
  • (x - 1) % k + 1
  1. ④ 处应填( )。

{{ select(37) }}

  • vis[i] == 1
  • vis[a[i]] == 0
  • vis[i] == 0
  • vis[a[i]] == 1
  1. ⑤ 处应填( )。

{{ select(38) }}

  • 1
  • n - 1
  • 2
  • 0

(2)好运的日期

一个日期可以用 xxyyzz 日来表示。我们称一个日期是好运的,当且仅当 x×y×(wz+1)x\times y\times(w-z+1) 为质数,其中 wwxxyy 月的总天数。输入 x,y,zx,y,z,判断其对应的日期是否好运。保证 xx 是不超过 2024 的正整数,yy 是不超过 12 的正整数,x,y,zx,y,z 可以构成一个合法的日期。

试补全线性筛法算法,空间限制 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  }
  1. ① 处可以填( )。

{{ select(39) }}

  • 753005
  • 10000000000
  • 725041
  • 2024
  1. ② 处应填( )。

{{ select(40) }}

  • j <= cnt
  • i * prime[j] <= n
  • (j <= cnt) && (i * prime[j] <= n)
  • (i <= cnt) && (prime[i] * prime[j] <= n)
  1. ③ 处应填( )。

{{ select(41) }}

  • not_prime[i] = true
  • return
  • continue
  • break
  1. ④ 处应填( )。

{{ 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))
  1. ⑤ 处应填( )。

{{ select(43) }}

  • 1
  • 7
  • 8
  • 2