2026/9/12 初赛模拟 3
注:由 GPT-6 Astra
下面是整卷参考答案+逐题简析。第 25 题和幻方题的输出已核算;第 38 题存在两个正确选项。
一、单项选择题(1~15)
题号 答案 简析
1 B 每轮读入 5 个新元素,最后弹出第 5 个,栈顶为本轮第 4 个,即 (5\times2019-1=10094)。
2 C 二分查找判定树各层分别有 1、2、4、4 个元素,平均比较次数为 ((1+4+12+16)/11=3)。
3 D ((1762)8=512+448+48+2=1010),((3F2)=768+240+2=1010)。
4 D 四个数开平方向下取整得到 1、2、3、4,互不相同;其他选项中 6 和 17 会冲突。
5 C 两部分各放 6 个顶点,全部跨部连边,最多 (6\times6=36) 条。
6 C 顺序是 b、e、a、d、c:处于峰顶就返回,处于上升段向右找,否则向左找。
7 D 不随机化时,某些输入会使划分持续失衡,时间退化到 (O(n^2))。
8 B 按 8 位表示,正数是 01101010,取反加一得到 10010110。
9 C 掩码 00001111 保留低 4 位、清空高 4 位。
10 D 从循环链表的任一节点出发,都能沿后继遍历整个链表。
11 C (N+N/2+N/4+\cdots<2N),所以是 (O(N))。
12 B 每层总代价逐渐下降,总时间为 (O(n\log_2 n))。
13 B Cayley 公式:(n) 个不同标号顶点构成的无根树有 (n^{n-2}) 棵,故为 (5^3=125)。
14 D 两日期相差 41 年,包含 10 个闰日;相差天数模 7 为 2。星期一往前两天是星期六。
15 D 简单无向图最多有 (\binom92=36) 条边。
第 6 题按分支逻辑应选 C。不过原卷伪代码的中点计算也有问题:递归区间若为 ([l,k]),应取 mid=(l+k)/2,不能始终使用 k/2。
二、阅读程序(16~31)
第一段程序:拓扑排序+有向无环图最长路径 DP。
其中 len[a] 表示以节点 a 结尾的最长路径包含的顶点数,转移为:
[
\operatorname{len}[a]
=\max\left(1,\max_{j\to a}{\operatorname{len}[j]+1}\right).
]
题号 答案 简析
16 × 改成 degree[a]++ 后统计的是出度,但后续仍按入度的处理方式执行,逻辑不成立。
17 × 邻接矩阵扫描以及后面的 DP 都有两层循环;正常处理 DAG 时为 (O(n^2+m)),简单图下为 (O(n^2))。
18 √ graph、degree 是全局数组,进入 main 前已经自动初始化为 0。
19 √ 最长路径可以是 (0\to1\to3) 或 (0\to2\to3),均含 3 个顶点。
20 A graph[a][b] 表示是否存在有向边 (a\to b),属于邻接矩阵。
21 C 不断将入度为 0 的节点加入队列,使用的是拓扑排序。
第二段程序:数位 DP,统计区间内满足以下条件的 11 位整数:
不同时出现数字 4 和 8。
至少出现一段连续 3 个相同数字,连续更多个也允许。
p、pp 保存前两位;hw 记录是否已经出现过连续三位相同;top 表示当前是否受上界限制。
题号 答案 简析
22 √ 一旦 _4 和 _8 同时为真,直接返回 0。
23 × 连续 4 位、5 位相同同样包含连续 3 位相同,仍可能被统计。
24 C C 为 11 位,有连续相同数字,且不同时含 4 和 8。A、B 同时含 4 和 8;D 没有连续三位相同。
25 A 输出为 5。
第 25 题满足条件的数是:
12121285000
12121285111
12121285222
12121285333
12121285550
注意 12121285444 虽然含 444,但同时含 4 和 8,不能计入。
第三段程序:构造奇数阶幻方,并输出第一行。
设输入为 (t),程序将阶数改为 (n=2t-1)。填数时优先向右上方移动,越界则绕回;目标位置已填数等情况下,改为向下移动。
题号 答案 简析
26 × 输出数字个数为 (2t-1),不是 (2t)。
27 √ 输入 1 时,只有一个格子,输出 1。
28 A 输入 3,第一行是 17 24 1 8 15。
29 B 输入 5,阶数为 9,因此输出 9 个数字。
30 A 输入 4,阶数为 7,每行总和为 (7(7^2+1)/2=175)。
31 B 输入 2,第一行是 8 1 6。
幻方每行之和的计算方法:所有数的总和为
[
1+2+\cdots+n2=\frac{n2(n^2+1)}2,
]
再除以行数 (n),得到 (\frac{n(n^2+1)}2)。
三、完善程序(32~41)
第一段:循环比赛日程表。
每次把边长为 half 的表扩展为原来的两倍。左上部分保留,右上、左下部分加上 half,右下部分复制左上部分。
题号 答案 应填内容 原因
32 B a[0][0] = 1 从一个元素开始构造。
33 D j + half 填写右上部分。
34 C a[i][j] + half 对应编号增加 half。
35 A a[i][j+half] 左下部分与右上部分对应相同。
36 B half *= 2 本轮结束,已构造区域的边长翻倍。
第二段:带权并查集。
fa[x]:并查集父节点。
num[root]:这一列的战舰总数。
front[x]:维护到父节点的距离;执行 find(x) 后,变为到根节点的距离,也就是这一列中排在它前面的战舰数。
题号 答案 应填内容 原因
37 A front[n] += front[fa[n]] 路径压缩时,把父节点到根的距离累加进来。
38 B、D 均可 front[i] = 0 或 front[fa[i]] = 0 上一行已经执行 fa[i]=i,两种写法完全等价。
39 D num[fy] += num[fx] 将 fx 所在列接到 fy 所在列后,更新新根的集合大小。
40 D fx != fy 根不同说明不在同一列,输出 −1。
41 A abs(front[x]-front[y])-1 两者位置差减去 1,就是中间的战舰数。
第 38 题若必须单选,建议填 B;但 D 在原程序中也正确,这道题不满足“唯一正确选项”。
By:GPT
OI / C++ / Algorithm
懒惰者出局。

浙公网安备 33010602011771号