logo AlgoBeat OnlineJudge 返回比赛
登录 注册

A. [Sleeping Cup #12] 2026 Sleeping Cup CSP-J1/S1 Mock Test

题目类型:答案提交 评测方式:文本比较

题目描述

你需要将 43 道题目的答案分别写入 1.txt - 43.txt,其中判断题的答案为单个大写字母 TF,选择题的答案为正确选项对应的单个大写字母。

一、基础知识(共 15 小题,每小题 2 分,满分 30 分)

(一)环境配置(3 小题,6 分)

第 1 题

下列关于图灵机的说法一定不正确的是()。

A. 有无穷多个
B. 包含无穷多个状态
C. 接受无穷多种输入
D. 能运行无穷多步而不停机

第 2 题

摩尔定律对()的性能迭代速度做出了预测。

A. CPU
B. GPU
C. RAM
D. ROM

第 3 题

在 NOI Linux 2.0 上安装 GNU G++ 9.3.0 编译器的方式是()。

A. 系统预装
B. 通过 apt 包管理器获取
C. 通过 Git 拉取 Github 仓库得到二进制文件
D. 在 GNU 官网获取源代码自行构建

(二)系统操作(3 小题,6 分)

第 4 题

/home 目录下执行下列命令,执行结果与其他三个差异最大的是()。

A. cd .
B. cd ..
C. cd /
D. cd //

第 5 题

在某个时间限制为 秒的题目下,某测试点的自测结果如下,则()。

real    0m1.931s
user    0m0.945s
sys     0m0.985s

A. 超过时间限制,以此申诉会被接受
B. 超过时间限制,以此申诉不会被接受
C. 没有超过时间限制,以此申诉会被接受
D. 没有超过时间限制,以此申诉不会被接受

第 6 题

下列指令中会让待编译的 C++ 程序无法通过编译的是()。

A. echo "int main(){}" > A.cpp && g++ A.cpp -O2 -lm -fsanitize=undefined
B. echo "int main(){}" > B.cpp && g++ B.cpp -static -fsanitize=undefined
C. echo "int main(){}" > C.cpp && g++ C.cpp -O2 -lm -fsanitize=address
D. echo "int main(){}" > D.cpp && g++ D.cpp -static -fsanitize=address

(三)程序编写(3 小题,6 分)

第 7 题

下列头文件中被 bits/stdc++.h 包含的是()。

A. glad
B. locale
C. opencv2
D. sys

第 8 题

下面两个数组占用的空间分别为()。

struct E { void greet() { puts("Hello!"); } } e[1024];
union U { int x; char y; } u[1024];

A. 0,4 KiB
B. 0,5 KiB
C. 1 KiB,4 KiB
D. 1 KiB,5 KiB

第 9 题

-O0 开关下,以下代码的时间复杂度是()。

int f(int n)
{
	if (n <= 1) return n;
	int s = 0;
	for (int i = 1; i <= n - 1; i++)
		s += f(n - i);
	return s;
}

A.
B.
C.
D.

(四)逻辑推理(3 小题,6 分)

第 10 题

存储 位二进制数至少需要()个三进制位。

A.
B.
C.
D.

第 11 题

同时接受 ABCDEFABCFEDACEFDB 三个序列作为 DFS 序的有根树有()棵。

A.
B.
C.
D.

第 12 题

Sleeping Lion 带着 匹速度互不相同的马穿越到了战国时期,重新组织了一次「田忌赛马」,并安排对局让田忌以 险胜齐威王,则开赛前可能的马匹分配方式有()种。

A.
B.
C.
D.

(五)按位求解(3 小题,6 分)

给定序列 请完成下面三个问题。

第 13 题

在相邻两项间填入 中的一个,所组成的算式可能出现的最大运算结果是()。

A.
B.
C.
D.

第 14 题

从中选出两个数,能够得到的最大异或和为()。

A.
B.
C.
D.

第 15 题

下面四个上述序列的子序列中,对应集合不存在所含元素异或和为 的非空子集的是()。

A.
B.
C.
D.

二、阅读程序(共 18 小题,除标注外,判断题 1 分,选择题 3 分,满分 40 分)

(六)单词缩写(6 小题,13 分;第 16 - 18 题为判断题,第 19 - 21 题为选择题,第 21 题 4 分)

#include <cstdio>
#include <cstring>
using namespace std;
char s[50];
int main()
{
	int P = scanf("%s", s + 1);
	int Q = printf("%c%u%c\n", s[1], strlen(s + 1) - 2, s[strlen(s + 1)]);
	return 0;
}                                                                               // Line 10

输入格式:

不超过 个(但不少于 个)大小写拉丁字母字符。

第 16 题

第 17 题

第 18 题

输入 a,输出 a-1a

第 19 题

在 NOI Linux 2.0 下,从控制台读入时,()可以代替回车让程序结束读入。

A. Ctrl + A
B. Ctrl + B
C. Ctrl + C
D. Ctrl + D

第 20 题

忽略输入格式要求,输入 Sleeping Lion,输出()。

A. S6g
B. S8g
C. S11n
D. S13n

第 21 题

忽略输入格式要求,下列输入中不会使得程序行为未定义的最长输入是()。

A. 输入 a
B. 输入 a
C. 输入 a
D. 输入 a

(七)休息时间(6 小题,13 分;第 22 - 24 题为判断题,第 25 - 27 题为选择题,第 27 题 4 分)

#include <algorithm>
#include <iostream>
#include <utility>
using namespace std;
pair <int, int> c[100012];
bool cmp(pair <int, int> first, pair <int, int> second)
{
	return first.first < second.first;
}
int main()
{
	int n, k, x = 0;
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
		cin >> c[i].first >> c[i].second;
	sort(c + 1, c + n + 1, cmp);                                // Line 16
	for (int i = 1; i <= n; i++)
	{
		if (c[i].first - x >= 2)
			cout << x + 1 << ' ' << c[i].first - 1 << endl;
		x = max(x, c[i].second);
	}
	if (x < k) cout << x + 1 << ' ' << k;
	return 0;
}                                                               // Line 25

输入格式:

第一行两个正整数,分别为

下面 行,第 行两个正整数

第 22 题

该程序的时间复杂度为

第 23 题

输出数据中每行的第一个整数总是不大于第二个整数。

第 24 题

将第 行的 c + 1 改为 c,程序对所有输入的运行结果不变。

第 25 题

输入以下数据:

5 25
2 8
3 7
11 15
16 20
<1> 23

输出结果为:

1 1
9 10
21 22
<2> 25

填写 <1> 处和 <2> 处缺失的内容:(

A.
B.
C.
D.

第 26 题

输入以下数据:

5 20
1 3
6 10
11 13
16 20
<3> <4>

输出结果为空,则填写 <3> 处和 <4> 处缺失的内容的方案数为:(

A.
B.
C.
D.

第 27 题

输出数据至多有()行。

A.
B.
C.
D.

(八)重心分解(6 小题,14 分;第 28 - 30 题为判断题,第 31 - 33 题为选择题,第 33 题 5 分)

#include <algorithm>                                                                        // Line 1
#include <iostream>
#include <vector>
using namespace std;
int size1[100012], size2[100012], layer[100012], above[100012];
vector <int> e[22][100012], d[100012];
bool label[22][100012];
void dfs0(int x, int up, int round)
{
	size1[x] = 0;                                                                           // Line 10
	size2[x] = 0;                                                                           // Line 11
	label[round + 1][x] = true;
	for (auto y: e[round][x])
	{
		if (y == up) continue;                                                              // Line 15
		dfs0(y, x, round);
	}
}
int dfs1(int x, int up, int round)
{
	size1[x] = 1;
	for (auto y: e[round][x])
	{
		if (y == up) continue;
		size1[x] += dfs1(y, x, round);
	}
	return size1[x];
}
void dfs2(int n, int x, int up, int round)
{
	size2[x] = n - size1[x];
	for (auto y: e[round][x])
	{
		if (y == up) continue;
		size2[x] = max(size2[x], size1[y]);
		dfs2(n, y, x, round);
	}
}
void dfs3(int x, int up, int top, int round)
{
	above[x] = top;
	if (x != top && up != top)
	{
		e[round + 1][x].push_back(up);
		e[round + 1][up].push_back(x);
	}
	for (auto y: e[round][x])
	{
		if (y == up) continue;
		dfs3(y, x, top, round);
	}
}
int center(int n, int start, int round)                                                     // Line 53
{
	int total = dfs1(start, 0, round);
	dfs2(total, start, 0, round);
	for (int i = 1; i <= n; i++)
		if (size1[i] && 2 * size2[i] <= total)
		{
			dfs0(start, 0, round);                                                          // Line 60
			return i;
		}
	return -1;
}
void build(int n)
{
	for (int i = 1; i <= 20; i++)
		for (int j = 1; j <= n; j++)
			if (!layer[j] && !label[i][j])
			{
				int root = center(n, j, i - 1);
				layer[root] = i;
				if (i >= 2)
				{
					d[root].push_back(above[root]);
					d[above[root]].push_back(root);
				}
				dfs3(root, 0, root, i - 1);
			}
}
int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n - 1; i++)
	{
		int x, y;
		cin >> x >> y;
		e[0][x].push_back(y);
		e[0][y].push_back(x);
	}
	build(n);
	for (int i = 1; i <= n; i++)
	{
		sort(d[i].begin(), d[i].end());
		for (auto y: d[i])
			if (y > i) cout << i << ' ' << y << endl;
	}
	return 0;
}                                                                                           // Line 100

输入格式:

第一行一个正整数 ,表示无向图 的结点个数。

约定 个结点的标号分别为

下面 行,第 行两个正整数 ,表示 中的一条无向边

中有且仅有输入数据中描述的无向边。

保证 是一棵无根树。

约定无向图 个结点的标号分别为

输出数据中第 行的两个正整数 表示 中的一条无向边

中有且仅有输出数据中描述的无向边。

第 28 题

行的 center 函数不可能返回

第 29 题

删去第 行,则程序可能会出现运行超时、运行错误等问题。

第 30 题

删去第 行和第 行,在第 行后加入 #include <cstring>,在第 行后加入 memset(size1, 0, sizeof size1);memset(size2, 0, sizeof size2);,则新程序在最坏情况下的时间复杂度比原程序更劣。

第 31 题

输入以下数据:

8
1 2
3 4
5 6
7 8
2 4
4 6
6 8

则输出数据中所有正整数的和为()。

A.
B.
C.
D.

第 32 题

程序运行过程中,layer 数组中元素的最大可能值是()。

A.
B.
C.
D.

第 33 题

以下输入数据中均有 ,其中会导致 不同构的是()。

A.
B.
C.
D.

三、补全程序(共 10 小题,每小题 3 分,满分 30 分)

(九)前缀最大(5 小题,15 分)

现有一个 的排列 ,设 中前 项的最大值,给定序列 ,试构造一个合法的排列 ,如果无解则输出

#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
int a[10000012], b[10000012];
queue <int> c;
int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	for (int i = 1; i <= n; i++)
		if (a[i] /* (34) _____ */ max(a[i - 1], i))
		{
			puts("-1");
			return 0;
		}
	for (int i = 1; i <= n; i++)
		if (a[i] /* (35) _____ */ a[i - 1])
		{
			b[i] = a[i];
			for (int j = /* (36) _____ */; j <= /* (37) _____ */; j++)
				c.push(j);
		}
	for (int i = 1; i <= n; i++)
	{
		if (b[i]) continue;
		int d = c.front();
		c.pop();
		b[i] = d;
	}
	for (int i = 1; i <= /* (38) _____ */; i++)
		printf("%d ", b[i]);
	printf("%d\n", b[n]);
	return 0;
}

第 34 题

A. >
B. >=
C. <
D. <=

第 35 题

A. >
B. >=
C. <
D. <=

第 36 题

A. 1
B. a[i - 1] - 1
C. a[i - 1]
D. a[i - 1] + 1

第 37 题

A. 1
B. a[i] - 1
C. a[i]
D. a[i] + 1

第 38 题

A. 1
B. n - 1
C. n
D. n + 1

(十)安全样例

定义一个「安全的样例」为满足以下条件的数字:

  • 是不大于 的正整数。
  • 十进制表示中不包含子串

求「安全的样例」的数量对 取模后的结果。

中只含数字字符。

#include <algorithm>
#include <iostream>
#include <string>
#define B39 /* (39) _____ */
#define B40 /* (40) _____ */
#define B41 /* (41) _____ */
#define B42 /* (42) _____ */
#define B43 /* (43) _____ */
using namespace std;
const int P = 1e9 + 7;
int f[1012][1012][2], p[1012];
void accumulate(int& x, int y)
{
	x += y;
	if (x >= P) x -= P;
}
int main()
{
	string n, S;
	cin >> n >> S;
	reverse(n.begin(), n.end());
	int m = (int) S.size(), l = (int) n.size() - 1;
	S = ' ' + S;
	for (int i = 2; i <= m; i++)
	{
		int h = p[i - 1];
		while (h)
		{
			if (B39) break;
			B40;
		}
		if (B39) h++;
		p[i] = h;
	}
	for (int j = 1; j <= n[l] - '0'; j++)
		f[l][B41][j == n[l] - '0'] = 1;
	for (int i = l - 1; i >= 0; i--)
		for (int j = 1; j <= 9; j++)
			f[i][B41][0]++;
	for (int i = l - 1; i >= 0; i--)
		for (int j = 0; j <= B42; j++)
			for (int k = 0; k <= 9; k++)
			{
				int h = j;
				while (B43 && h) B40;
				if (!(B43)) h++;
				accumulate(f[i][h][0], f[i + 1][j][0]);
				if (k <= n[i] - '0') accumulate(f[i][h][k == n[i] - '0'], f[i + 1][j][1]);
			}
	int a = 0;
	for (int i = 0; i <= B42; i++)
	{
		accumulate(a, f[0][i][0]);
		accumulate(a, f[0][i][1]);
	}
	cout << a << endl;
	return 0;
}

第 39 题

A. S[h] == S[i]
B. S[h] == S[i + 1]
C. S[h + 1] == S[i]
D. S[h + 1] == S[i + 1]

第 40 题

A. h = p[h]
B. h = p[h] + 1
C. h = p[h + 1]
D. h = p[h + 1] + 1

第 41 题

A. j == S[0] - '0'
B. j != S[0] - '0'
C. j == S[1] - '0'
D. j != S[1] - '0'

第 42 题

A. 1
B. m - 1
C. m
D. m + 1

第 43 题

A. k == S[h] - '0'
B. k != S[h] - '0'
C. k == S[h + 1] - '0'
D. k != S[h + 1] - '0'

编辑器加载中 …