这里写自定义目录标题
更多精彩内容
这里是带你游历编程世界的Dashcoding编程社,我是Dash/北航硕士/ICPC区域赛全国排名30+/给你呈现我们眼中的世界!
256题算法特训课,帮你斩获大厂60W年薪offer
原题
2023ICPC澳门真题传送
B站动画详解
问题分析
题目要求从房间 0 0 0 到达房间 x x x 的最小能量消耗。可以进行两种操作:传送到房间 ( i + a i ) % n (i + a_i) \% n (i+ai)%n 或者增加当前房间的数值 a i a_i ai。每次操作都消耗一点能量,问题的本质是一个最短路径问题。
这个问题可以通过图论中的单源最短路径算法来解决。我们将每个房间视为图中的节点,操作视为从一个节点到另一个节点的边,求解从节点 0 0 0 到节点 x x x 的最短路径。
思路分析
图的构建
-
传送操作:
如果在房间 i i i 进行传送操作,可以跳到房间 ( i + a i ) % n (i + a_i) \% n (i+ai)%n。因此,这个操作在图中表示为一条从节点 i i i 到节点 ( i + a i ) % n (i + a_i) \% n (i+ai)%n 的有向边,权值为 1 1 1。 -
数值增加操作:
如果选择增加房间的数值 a i ← a i + 1 a_i \leftarrow a_i + 1 ai←ai+1,则可以使得下次传送跳到下一个房间,因此在图中可以加入一条从房间 i i i 到房间 i + 1 i + 1 i+1 的边,权值也为 1 1 1。 -
特殊处理房间 0 0 0:
为了处理房间 0 0 0 的特殊情况(即只有在第二次及以后回到房间 0 0 0 时,才会从 0 0 0 引出一条边到 1 1 1),我们引入一个额外的节点 n n n,表示从 0 0 0 多次到达的状态。
最短路径算法
使用 Dijkstra 算法来计算从节点 0 0 0 到节点 x x x 的最短路径。Dijkstra 算法适用于具有非负权值的图,在该题中,每条边的权值为 1 1 1,正好符合该算法的要求。
具体步骤
- 初始化图,将每个节点与其对应的边构建好。
- 运行 Dijkstra 算法,计算从节点 0 0 0 出发到所有节点的最短路径。
- 输出节点 x x x 的最短距离,即为答案。
算法实现
Dijkstra 算法
Dijkstra 算法是一种贪心算法,用于解决单源最短路径问题。它通过优先队列(最小堆)来确保每次扩展的节点是当前距离最短的节点,从而保证计算出的路径是最优的。在本题中,我们将图中的每条边的权值设为 1 1 1,因此算法能够高效地计算最短路径。
图的构建
对于每个房间 i i i,我们有两种操作:
- 传送到房间 ( i + a i ) % n (i + a_i) \% n (i+a

最低0.47元/天 解锁文章
427

被折叠的 条评论
为什么被折叠?



