#766. [CSPJ2609 初赛] 模拟题十六
[CSPJ2609 初赛] 模拟题十六
一、单项选择题(每题 分,共 分)
- 已知前序遍历序列为 ,中序遍历序列为 ,则后序遍历为( )
{{ select(1) }}
- 哈希表采用链地址法解决冲突,若哈希函数为 ,插入序列 ,则哈希表中链表最长的长度为( )
{{ select(2) }}
- 若有 个元素的序列,采用冒泡排序,最少比较次数为( )
{{ select(3) }}
- 一个循环队列的队首和队尾指针分别为 和 ,数组容量为 ,则队列长度为( )
{{ select(4) }}
- 高度为 的平衡二叉树(AVL 树),最少包含的结点数为( )
{{ select(5) }}
- 已知递归函数: , , ,则 的值为( )
{{ select(6) }}
- 逻辑表达式
!(a && b) || (a || !b)的恒等结果为( )
{{ select(7) }}
- 恒真
- 恒假
- 快速排序在最坏情况下的时间复杂度和空间复杂度分别是( )
{{ select(8) }}
- 、
- 、
- 、
- 、
- 模 意义下, 的乘法逆元为( )
{{ select(9) }}
- 十进制小数 转换为二进制小数为( )
{{ select(10) }}
- 字符串
"noip2026"的非空子串个数为( )
{{ select(11) }}
- 完全无向图 有 个顶点,删除( )条边可得到一棵树
{{ select(12) }}
- 将中缀表达式
a + b * c + d转为后缀表达式,结果为( )
{{ select(13) }}
a b + c * d +a b c + d * +a b c * + d +a b c * d + +
- 从 双不同的鞋子中任取 只,恰有 只配成一双的取法数为( )
{{ select(14) }}
- 下列编码中,属于前缀码的是( )
{{ select(15) }}
程序输入不超过数组或字符串定义的范围。
除特殊说明外,判断题每题 分,选择题每题 分,共 分。判断题正确填「正确」,错误填「错误」。
阅读程序(一)
#include <bits/stdc++.h>
using namespace std;
int n, a, ans;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a);
ans ^= a;
}
printf("%d", ans);
return 0;
}
(1) 若输入为 4 1 2 3 4,程序输出为 。
{{ select(16) }}
- 正确
- 错误
(2) 若输入为 9 2 2 1 3 3 3 2 3 1,程序输出为 。( 分)
{{ select(17) }}
- 正确
- 错误
(3) 程序输出结果的范围在 之间。
{{ select(18) }}
- 正确
- 错误
(4) 若输入为 6 1 1 2 2 3 3,程序输出为:
{{ select(19) }}
(5) 以下哪个输入会使程序输出 ?
{{ select(20) }}
3 3 1 44 2 0 2 64 9 5 2 78 6 2 9 5 1 4 1 3
(6) 程序执行过程中,若输入为 3 7 7 7,则 ans 的变化过程为:
{{ select(21) }}
阅读程序(二)
#include <bits/stdc++.h>
using namespace std;
int n;
char lson[30], rson[30];
void preOrder(char u) {
if (u == '*') return;
cout << u;
preOrder(lson[u - 'a']);
preOrder(rson[u - 'a']);
}
int main() {
cin >> n;
char root;
for (int i = 1; i <= n; ++i) {
char fa, l, r;
cin >> fa >> l >> r;
if (i == 1) root = fa;
int idx = fa - 'a';
lson[idx] = l;
rson[idx] = r;
}
preOrder(root);
return 0;
}
(1) 函数 preOrder 的遍历顺序是:左子树 根结点 右子树。
{{ select(22) }}
- 正确
- 错误
(2) 变量 代表二叉树叶子结点的数量。( 分)
{{ select(23) }}
- 正确
- 错误
(3) 递归函数 preOrder 会存在栈溢出风险,当二叉树退化成单链且深度超过递归栈上限时。
{{ select(24) }}
- 正确
- 错误
(4) 将 preOrder(lson[...]) 和 preOrder(rson[...]) 交换位置,输出序列变为中序遍历。
{{ select(25) }}
- 正确
- 错误
(5) 若输入如下,下列说法正确的是:
2
a b *
b * *
{{ select(26) }}
- 输出为
ab - 输出为
ba - 程序会发生数组越界
- 程序会死循环
(6) 若输入如下,程序输出的结果是:
6
abc
bdi
cj*
d**
i**
j**
{{ select(27) }}
adbicjadbcijabdcijabdicj
阅读程序(三)
#include <bits/stdc++.h>
using namespace std;
int n, val[105];
long long dp[105][105];
int root[105][105];
void print(int l, int r) {
if (l > r) return;
int k = root[l][r];
cout << k << " ";
print(l, k - 1);
print(k + 1, r);
}
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> val[i];
dp[i][i] = val[i];
root[i][i] = i;
}
for (int len = 2; len <= n; ++len) {
for (int l = 1; l + len - 1 <= n; ++l) {
int r = l + len - 1;
dp[l][r] = 0;
for (int k = l; k <= r; ++k) {
long long left = (l > k - 1) ? 1 : dp[l][k - 1];
long long right = (k + 1 > r) ? 1 : dp[k + 1][r];
long long now = left * right + val[k];
if (now > dp[l][r]) {
dp[l][r] = now;
root[l][r] = k;
}
}
}
}
cout << dp[1][n] << endl;
print(1, n);
return 0;
}
(1) print(l,r) 函数输出顺序是二叉树的后序遍历。
{{ select(28) }}
- 正确
- 错误
(2) 交换 print(l,k-1) 和 print(k+1,r) 的调用顺序,输出变为根 右 左。
{{ select(29) }}
- 正确
- 错误
(3) 该算法的时间复杂度为 。
{{ select(30) }}
- 正确
- 错误
(4) 若输入 , ,则输出最大加分为:
{{ select(31) }}
(5) 函数 print 在输出时,若某结点无左子树,则:
{{ select(32) }}
- 输出
- 什么也不输出
- 输出
- 递归终止
(6) 若 , ,程序输出最大加分为:
{{ select(33) }}
单项选择题,每题 分,共 分。
完善程序(一)
P11963 [GESP202503 六级] 环线
地铁环线有 个车站,依次以 标号。车站 ()的下一个车站是 ,车站 的下一个是 。从小 A 某个车站出发到某个车站结束,至少经过一个车站,且不会经过同一车站多次。经过车站 获得快乐值 。求一段行程快乐值之和的最大值。
第一行正整数 。第二行 个整数 。输出一个整数,表示最大快乐值。
样例:
5
-3 4 -5 1 3
5
下面程序请补全。
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
int n;
long long a[N], pre[N];
int q[N], ql, qr;
long long ans;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
a[n + i] = a[i];
}
for (int i = 1; i <= 2 * n; i++) {
①;
}
ql = qr = 1;
ans = -1e18;
for (int i = 1; i <= 2 * n; i++) {
while (②) {
ql++;
}
ans = max(ans, ③);
while (④) {
qr--;
}
⑤;
}
printf("%lld\n", ans);
return 0;
}
(1) ① 处应填( )
{{ select(34) }}
pre[i] = pre[i - 1] + a[i]pre[i] = pre[i] + a[i - 1]pre[i] = pre[i - 1] + a[i - 1]pre[i] = pre[i] + a[i]
(2) ② 处应填( )
{{ select(35) }}
ql <= qr && q[ql] < pre[q[ql]]ql <= qr && q[ql] < pre[q[qr]]ql <= qr && q[ql] < q[qr]ql <= qr && q[ql] < i - n
(3) ③ 处应填( )
{{ select(36) }}
pre[i] - q[qr]pre[i] - q[ql]pre[i] - pre[q[qr]]pre[i] - pre[q[ql]]
(4) ④ 处应填( )
{{ select(37) }}
ql <= qr && pre[i] < pre[q[ql]]ql <= qr && pre[i] < pre[q[qr]]ql <= qr && pre[i] < q[ql]ql <= qr && pre[i] < q[qr]
(5) ⑤ 处应填( )
{{ select(38) }}
q[qr] = iq[ql] = iq[++qr] = iq[++ql] = i
完善程序(二)
B4279 [蓝桥杯青少年组国赛 2023] 数独填数
玩家需要根据 网格上的已知数字,将剩余空格填上数字,使得每一行、每一列、每一个 方块都包含 且不重复。输入 行,每行 个字符(数字或 .)。保证有唯一解。输出 行已完成的数独,每行 个数字,数字之间无空格。
样例:
17.5..8..
.52.1....
.....759.
.8...94.3
.197.4..8
7......15
4.1...6..
3...2..59
...96..3.
174593826
952816347
638247591
286159473
519734268
743682915
491375682
367428159
825961734
下面程序请补全。
#include <bits/stdc++.h>
using namespace std;
char g[9][9];
bool row[9][10], col[9][10], box[9][10];
bool found;
void dfs(int x, int y) {
if (found) return;
if (x == 9) {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j)
cout << g[i][j];
cout << endl;
}
found = true;
return;
}
if (y == 9) {
①;
return;
}
if (g[x][y] != '.') {
②;
return;
}
for (int num = 1; num <= 9; ++num) {
int b = x / 3 * 3 + y / 3;
if (③) {
g[x][y] = num + '0';
row[x][num] = true;
col[y][num] = true;
box[b][num] = true;
④;
g[x][y] = '.';
row[x][num] = false;
col[y][num] = false;
box[b][num] = false;
}
}
}
int main() {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
cin >> g[i][j];
if (g[i][j] != '.') {
int num = g[i][j] - '0';
int b = i / 3 * 3 + j / 3;
row[i][num] = true;
col[j][num] = true;
box[b][num] = true;
}
}
}
⑤;
return 0;
}
(1) ① 处应填( )
{{ select(39) }}
dfs(x, 0)dfs(x + 1, 0)dfs(x, y + 1)dfs(x + 1, y + 1)
(2) ② 处应填( )
{{ select(40) }}
dfs(x + 1, y)dfs(x, y)dfs(x + 1, y + 1)dfs(x, y + 1)
(3) ③ 处应填( )
{{ select(41) }}
row[x][num] && !col[y][num] && !box[b][num]!row[x][num] && col[y][num] && !box[b][num]!row[x][num] && !col[y][num] && box[b][num]!row[x][num] && !col[y][num] && !box[b][num]
(4) ④ 处应填( )
{{ select(42) }}
dfs(x + 1, y)dfs(x + 1, y + 1)dfs(x, y + 1)dfs(x, y)
(5) ⑤ 处应填( )
{{ select(43) }}
dfs(0, 0)dfs(0, 8)dfs(8, 0)dfs(8, 8)