1 条题解
-
0
参考答案与详细解析
一、 单项选择题
- B。插空法。6 个蓝球产生 7 个空隙(包括两端),从中选 4 个位置放入红球,方案数为 。
- A。。
- :
a - :
ab - :
aba(a) - :
abab(ab) - :
ababa(aba) - :
ababac(前缀a与后缀c不匹配,且无更短匹配) - :
ababaca(a) 结果为 。
- :
- C。线段树查询区间 访问的节点为:
[0,15],[0,7],[8,15],[0,3],[4,7](完全包含),[2,3](完全包含),[8,11](完全包含),[12,15],[12,13](完全包含)。共 9 个节点。 - C。Trie 树节点:root(1), a(1), p(1), p(1, app结束), l(1), e(1, apple结束), y(1, apply结束), e(1, ape结束), b(1), a(1), t(1, bat结束), g(1, bag结束)。共 12 个节点。
- B。DAG 存在唯一拓扑排序的充要条件是图中存在一条包含所有顶点的有向路径(即哈密顿路径),此时拓扑序唯一且相邻顶点间必有边。
- B。二次探查 。
- 23:
- 34: (冲突),
- 45: (冲突), (满),
- 12: (冲突), (满), (满),
- 56: (冲突), (满), (满), (满), 。
- B。边权 。为最小化总权重,每个顶点 应直接连接到顶点 1,边权为 。总权重 = 。
- A。后序最后是
A,故根为A。中序中A分割左右子树:左D B E,右F C。左子树后序D E B,根为B,中序D B E分割得左D右E。右子树后序F C,根为C,中序F C分割得左F。前序遍历为:根-左-右A B D E C F。 - C。容量 15。物品:(3,8), (4,10), (5,12), (6,15), (7,18)。最优组合为选重量 3, 5, 7 的物品,总重量 ,总价值 。
- D。1 是整棵树的根节点,任何节点与根节点 1 的 LCA 必然是 1。因此 是不可能出现的。
- C。主定理:。。,属于主定理第二种情况的扩展,时间复杂度为 。
- C。最大堆插入后为:30 (根), 左子 25, 右子 15; 25 的子节点为 20, 10; 15 的子节点为 5。
- 删除 30:5 移至根,下沉与 25 交换,再与 20 交换。堆变为:25, 20, 15, 5, 10。
- 删除 25:10 移至根,下沉与 20 交换。堆变为:20, 10, 15, 5。堆顶为 20。
- B。容斥原理。。
- 能被整除的数 = 。
- 不能被整除的数 = 。
- B。分治法在合并时需要 时间计算跨越中点的最大子段和,存在大量重复计算;而 Kadane 算法通过 的状态转移(
dp[i] = max(a[i], dp[i-1] + a[i]))避免了重复计算,将复杂度降至 。 - B。这是经典的带截止时间调度问题(最小化延迟惩罚等价于最大化按时完成的任务权重)。最优贪心策略为:按截止时间排序依次尝试加入,若总时间超过当前任务截止时间,则剔除已选任务中处理时间最长的任务(Moore-Hodgson 算法思想)。
二、 阅读程序
(1)
- A (正确)。 时,全排列 6 种。排除含有相邻递增对(如 12, 23)的排列:123, 231, 312。剩余合法排列为:132, 213, 321,共 3 种。
- A (正确)。初始调用
dfs(1),递归调用dfs(k+1),直到k == n + 1时触发基线条件返回,故 会取到 。 - B (错误)。
flag[i]=false是回溯算法恢复状态的标准操作。若删除,数字被标记后将无法在后续分支中使用,导致答案错误(通常变为 1 或 0)。 - A。 时,总排列 24 种。利用容斥原理计算包含 "12", "23", "34" 的排列数:$3 \times 3! - 3 \times 2! + 1 \times 1! = 18 - 6 + 1 = 13$。合法排列数 = 。
- D。
p数组仅在 时读取p[k-1],而p[k-1]的值是在上一层dfs中被显式赋值的(p[k] = i)。因此p的初始值不会被读取,对程序无影响。 - C。删除
flag检查后,相当于每个位置可选 ,但不能出现 。使用 DP 计算: 时有 3 种; 时以 1, 2, 3 结尾的序列数分别为 3, 2, 2; 时分别为 7, 4, 5。总和为 。
(2)
- A (正确)。 时线性扫描, 需检查 1,2,3,4,5,共 5 次。 时, ()。先查 3 (False),再查 (True, 碎了),然后在区间 线性查 4 (False),最后断言 5 正确。共调用
check3 次。 - B (错误)。反例:。 时查 1 即中,共 1 次。 时 ,先查 3 (True, 碎了),再查 1 (True, 碎了),共 2 次。此时 的猜测数大于 。
- A (正确)。 遍历必定命中; 是经典的“两枚鸡蛋”最优策略,步长递减保证了在最多碎 2 次的情况下能精确覆盖 的所有可能。
- B。
guess1中一旦check(i)返回 true,就会立即执行assert_ans并return,因此cnt_broken最多增加到 1。 - C。
guess2的步长 满足 ,即 。最坏情况下猜测次数为 次,量级为 。 - A。 最坏需 100 次。 时, ()。最坏情况(如在 14 碎了,需线性检查 1~13)共 次。
(3)
- B (错误)。第 55 行的双指针逻辑依赖于
ans1升序且ans2降序遍历(即ans2必须是有序的)。若删除sort(ans2),las的单调递增假设被破坏,会导致漏解。 - A (正确)。
mpow是标准的快速幂算法,通过二进制拆分指数在 时间内计算 。 - A (正确)。代码遍历排序后的
ans1,若当前元素与前一个相同则频次+1,否则存入新位置并初始化频次为 1,这是标准的去重并统计频次操作。 - B。输入表示求 $1 \cdot x_1^2 - 1 \cdot x_2^2 + 1 \cdot x_3^2 = 0 \Rightarrow x_1^2 + x_3^2 = x_2^2$,其中 。即求 15 以内的勾股数 的排列数。满足条件的有:(3,4,5), (4,3,5), (6,8,10), (8,6,10), (5,12,13), (12,5,13), (9,12,15), (12,9,15),共 8 组。
- C。折半搜索将 个变量分为两半,每半枚举 种状态。排序
ans1耗时 ,双指针匹配耗时 。总时间复杂度为 。 - D。DFS 中循环为
for (int i = 1; i <= m; ++i),且最终统计ans1[las] + ans2[i] == 0的组合数,即求 且 的整数解的数量。
三、 完善程序
(1)特殊最短路
- A。初始在起点 ,尚未使用免费边,故
used_freebie状态为 0。 - B。Dijkstra 标准优化:若当前取出的距离
dist大于已记录的最小距离d[u][used],说明该状态已过期,跳过。 - B。正常走边(不使用免费边),更新到达 且
used状态不变的最小距离,即d[v][used]。 - C。使用免费边时,前提是
used == 0。此时到达 的距离不变(费用为 0),状态变为used = 1。因此比较的是d[u][0]与d[v][1]。 - C。到达终点 时,可能使用了免费边,也可能未使用,取两者最小值
min(d[t][0], d[t][1])。
(2)组合测试
- B。根据信息论,可能的测试结果总数(长度为 且 1 的个数 的二进制串数量)必须不少于生产线数量 ,即
count_patterns(w, k) < n时 不够,需增加。 - A。
bits初始化为前ones个为 1,其余为 0。使用next_permutation可字典序生成所有包含ones个 1 的排列组合。 - D。
plan[i]存储第 轮测试包含的生产线编号。根据code矩阵,若code[j][i] == 1,表示第 条生产线在第 轮被测试。 - A。
signature的最低位对应第 1 批次(),因此提取第 位的操作为(signature >> i) & 1。 - B。解码时,只需找到
code矩阵中与测试结果sig_bits完全匹配的那一行,其行号 即为存在缺陷的生产线编号。
- 1
信息
- ID
- 12657
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 56
- 已通过
- 3
- 上传者