Mobile wallpaper 1
1878 字
9 分钟
20251130测验题解
2025-09-15
2025-11-30
统计加载中...

A 猫猫之城#

Problem tags: 图论, 最短路, 分层图

Prediction Difficulty:High

Actual Difficulty:High

Problem Statement#

给定一个包含 nn 个点、mm 条边的有向图,边有正权。你需要从点 11 走到点 nn。你拥有一张 VIP 卡,可以将任意一条边的权值变为 00(只能使用一次)。求从 11nn 的最短时间。

Solution#

  • 前后缀最短路(两次 Dijkstra):我们考虑最终的最短路径,它一定是由三部分组成:
1u免费vn1 \leadsto u \xrightarrow{\text{免费}} v \leadsto n
  • 其中 (u,v)(u, v) 是我们选择免费通过的那条边。路径的总耗时为:
Cost=dist(1u)+0+dist(vn)Cost = \text{dist}(1 \to u) + 0 + \text{dist}(v \to n)
  • 为了快速求出任意一条边 (u,v)(u, v) 作为免费边时的总耗时,我们需要知道:从 11uu 的最短距离和从 vvnn 的最短距离。
  • 11uu 的最短距离:这可以通过以 11 为起点,在原图上跑一次 Dijkstra 得到,记为 dis1[u]
  • vvnn 的最短距离:在有向图中,求“任意点到终点”的最短路,等价于求“终点到任意点”的最短路,但需要在反向图(所有边方向取反)上进行。我们可以建立反图,以 nn 为起点跑一次 Dijkstra,记为 dis2[v]
  • 时间复杂度为 O(mlogn)\mathcal{O}(m \log n)

B 井字棋#

Problem tags: DFS, 枚举

Prediction Difficulty:Medium

Actual Difficulty:Easy

Problem Statement#

给定一个 3×33\times3 的井字棋棋局,判断其当前状态属于哪一类。

Solution#

  • 棋盘共有 39=196833^9 = 19683 种状态,每格三种取值。
  • 方法一:从空棋盘出发按规则 DFS / 回溯生成所有可达的“合法”状态(轮流落子,出现胜负后不再继续扩展)。对每个搜索到的状态判断其属于哪一类并记录,未被搜索到的状态即视为 inexistence。总状态 1968319683,其中有效状态约 45204520 种。预处理完之后每次查询只需 O(1)\mathcal{O}(1)
  • 方法二
    • 定义 flagA,flagBflag_A, flag_B 表示 A、B 是否已经形成三连线,cntA,cntBcnt_A, cnt_B 表示 A、B 的棋子数量;遍历棋盘一次即可统计。
    • 若 A、B 同时获胜,或不满足 cntA=cntBcnt_A = cnt_B 且不满足 cntA=cntB+1cnt_A = cnt_B + 1,则该局面一定不合法。
    • 若只有 A 胜,则必须满足 cntA=cntB+1cnt_A = cnt_B + 1;若只有 B 胜,则必须满足 cntA=cntBcnt_A = cnt_B,否则也不合法。
    • 若棋盘已下满且前述不合法/胜负情况均排除,则为平局;否则是进行中的合法局面,此时由 cntA,cntBcnt_A, cnt_B 判断轮到谁下(cntA=cntBcnt_A=cnt_B 轮到 A,否则轮到 B)。整个判断在固定 3×33\times3 棋盘上完成,复杂度为 O(1)\mathcal{O}(1)

C 高等魂学#

Problem tags: 贪心, 排序, 模拟

Prediction Difficulty:Easy

Actual Difficulty:Easy

Problem Statement#

BOSS 生命值为 HH、防御力为 DD,有 nn 把一次性武器,第 ii 把攻击力为 aia_i,用给定破防公式计算单次伤害(已知对 Atk 单调不减),每把最多用一次,顺序可任意,累计伤害 H\ge H 即击杀,求最少用多少把武器,不可击杀则输出 1-1

Solution#

  • 由“伤害对 Atk 单调不减”,最优方案一定是优先用攻击力更大的武器。
  • aia_i 降序排序,依次按公式算出每把的伤害并累加,第一次使累计伤害 H\ge H 的位置即答案;若全部用完仍 <H<H 则输出 1-1
  • 时间复杂度 O(nlogn)\mathcal{O}(n\log n)

D 走出迷宫#

Problem tags: DFS, BFS

Prediction Difficulty:Medium

Actual Difficulty:Medium

Problem Statement#

找出从当前位置走出迷宫的最少步数,如果无法走出则输出 1-1

Solution#

  • dfsdfsbfsbfs 模拟这个过程即可,走到边界外的时候输出答案。
  • 开全局数组需要注意清空。

E hc找朋友#

Problem tags: DFS, LCA

Prediction Difficulty:High

Actual Difficulty:Very High

Problem Statement#

在一个树上找两点之间的距离。

Solution#

  • 题目没有指定根节点,那将 11 号节点设为根节点,先跑一遍 dfsdfs 得出 sum[i]sum[i]ii 到根节点的距离和。
  • 树上两点间的距离即为 sum[s]+sum[t]2×sum[lca(s,t)]sum[s]+sum[t]-2 \times sum[lca(s,t)]
  • 注意要开 long long

F 沉默魔女的投资#

Problem tags: 贪心, 排序

Prediction Difficulty:Easy

Actual Difficulty:Easy

Problem Statement#

给出 nn 天价格,只能买一次卖一次(可时间穿梭),求最大利润,不能盈利则输出 00

Solution#

  • 由于可任意选择买卖日,排序后,只需取 max(a)min(a)\max(a)-\min(a)
  • 瓶颈在于排序,时间复杂度 O(nlogn)\mathcal{O}(n\log n)

G 芙莉莲独自升级#

Problem tags: 二分, 贪心, 排序, 双指针

Prediction Difficulty:Very High

Actual Difficulty:Very High

Problem Statement#

给定多组数据,每组给出整数 n,x,yn,x,yy>xy>x)和 nn 个冒险者的魔力值 a1,,ana_1,\dots,a_n。 初始魔力为 xx,每次选择一个 ii:若当前魔力 ai\ge a_i,则魔力变为 x+1x+1,否则变为 x1x-1;并且整个过程中任意两名冒险者被挑战的次数之差不超过 11。 求使魔力达到 yy 所需的最少切磋次数。

Solution#

  • 对冒险者魔力值排序,使每轮的挑战顺序最优。
  • 预处理数组 ti,bit_i,b_i,记录最低初始魔力及连胜后的魔力。
  • 对当前魔力 xx,使用 upper_bound\mathrm{upper\_bound} 计算一轮内能连胜的数量 pp
  • 失败场数为 m=npm=n-p。若 pm0p-m \le 0,净收益非正,永远无法升到 yy,输出 1-1
  • 若本轮中 x+pyx+p \ge y,即可提前达到目标,直接输出答案。
  • 设一轮净收益 Δ=pm\Delta = p - m,多跑 kk 轮后魔力变为 x+kΔx + k\Delta
  • 求出两个限制轮数:
    • k1=yxppmk_1 = \left\lceil \frac{y - x - p}{p - m} \right\rceil(达到目标)
    • k2=tpxpmk_2 = \left\lceil \frac{t_p - x}{p - m} \right\rceil(连胜段扩张)
  • k=min(k1,k2)k = \min(k_1,k_2),一次性跳过 kk 个完整循环,避免逐轮模拟。
  • 更新:魔力 xx+k(pm)x \leftarrow x + k(p - m);答案 ansans+knans \leftarrow ans + kn;然后重新计算下一轮的连胜数量 pp
  • 随着 xx 增大,pp 只会上升,最多改变 nn 次,因此总复杂度为 O(nlogn)\mathcal{O}(n\log n)

H 边狱巴士是一款大概率发生小概率事件的游戏 - Medium#

Problem tags: 数学, 期望, 逆元

Prediction Difficulty:Very High

Actual Difficulty:High

Problem Statement#

与 Easy 版本题意相同(硬币投掷)。求该技能造成的期望伤害,结果对 998244353998244353 取模。

Solution#

  • 利用期望的线性性。总期望 = 普通硬币造成的期望伤害 + 不可摧毁硬币造成的期望伤害。
  • 每一枚硬币投出正面的概率均为 1/21/2,在模意义下除以 22 等价于乘以 22 的逆元。
  • 对于 aa 个普通硬币,只有投出正面才会有伤害。第 ii 个普通硬币(1ia1 \le i \le a)造成伤害的条件是正面(概率 1/21/2),此时威力为:基础 atkatk + 自身 addadd + 前面 i1i-1 个硬币贡献的期望 addadd
  • 单个硬币 ii 的期望伤害 EiE_i 为:
Ei=12(atk+add+i12add)E_i = \frac{1}{2} \left( atk + add + \frac{i-1}{2} add \right)
  • aa 个硬币求和:
i=1aEi=a(atk+add)2+a(a1)add8\sum_{i=1}^a E_i = \frac{a(atk+add)}{2} + \frac{a(a-1)add}{8}
  • 接下来是 bb 个不可摧毁硬币。它们必定攻击(概率 11)。第 jj 个不可摧毁硬币(1jb1 \le j \le b)的基础威力受前面所有硬币影响(aa 个普通,j1j-1 个不可摧毁,以及自身)。
  • jj 个硬币的期望伤害 EjE'_j 为:
Ej=atk+(a+1)add2+(j1)add2E'_j = atk + \frac{(a+1)add}{2} + \frac{(j-1)add}{2}
  • bb 个不可摧毁硬币求和 j=1bEj\sum_{j=1}^b E'_j
j=1bEj=batk+b(a+1)add2+b(b1)add4\sum_{j=1}^b E'_j = b \cdot atk + b \cdot \frac{(a+1)add}{2} + \frac{b(b-1)add}{4}
  • 将所有部分相加即为最终答案。
  • 单组 O(1)\mathcal{O}(1),总复杂度 O(t)\mathcal{O}(t),计算时需注意使用 long long 来进行存储。

致谢名单#

  • Author:

    Chenzq7, huangce, LANSGANBS

  • Tester:

    DKXTL, iamyouqi, skycheng, suroooo, zhouzhy

NOTE

排名按照字典序排序。

非常感谢各位 Tester 对本场比赛出题的帮助!

20251130测验题解
https://lansganbs.cn/posts/算法竞赛/20251130测验题解与std/
作者
LANSGANBS
发布于
2025-09-15
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时