[题解]P9749 [CSP-J 2023] 公路
思路
首先由一个显然的贪心,对于每一个站点 \(i\),它显然会只会加刚好到下一个满足 \(d_i > d_j\) 的站点 \(j\)。
但是这个贪心是由瑕疵的,因为我们只能加正整数的油,所以说难免会有多出的部分,所以需要特殊处理此部分。
那么求一个位置之后第一个大于它的数,可以直接用单调栈维护即可。
用单调栈可以求出一个 \(nxt_i\) 表示在 \(i\) 之后第一个满足 \(d_i > d_j\) 的 \(j\)。并且令 \(res\) 表示上一次加油行驶到当前站点还能行驶的距离。
因此,可以简单分讨一下(其中 \(dist\) 表示从 \(i\) 到 \(j\) 的距离):
-
当 \(res \leq dist\) 时,说明我们还需要在上一次剩下的油的基础上走 \(dist - res\),所以需要多加 \(\lceil \frac{dist - res}{D} \rceil\) 的油。然后更新答案和 \(res\)。
-
当 \(res > dist\) 时,说明我们在当前站点无需加油,可以直接行驶至 \(nxt_i\),并更新 \(res\) 为 \(res - dist\)。
code