0%

2025-ICPC-Asia-Taiwan-Online-台湾网络赛-J. Gas Station(贪心的关键是,找到最优子结构)(最优子结构是什么?就是在不在这贪取决于什么!)(每一颗子树都最小化加油站数量,再检测在最小化加油站数量前提下,是否违反了限制,强迫摆放加油站)

题目大意

亚历克斯正在规划在一个简化的台湾高速公路系统模型上设立休息区。该系统包含nn个互通立交,由n1n-1条双向道路连接。网络是连通的,任意一对互通立交之间有且仅有一条最短路径。第ii条道路连接互通uiu_iviv_i,长度为lil_i

可以建造恰好kk个带加油站的休息区,每个位于一个互通。司机可以从任意互通开始旅行到任何其他互通,始终沿着唯一最短路径。他们每次旅行都会带满油箱,只能在设有休息区的互通处加油。

亚历克斯想知道可能的最小燃油箱容量dd,以便可以以一种方式放置这kk个休息区,确保没有任何司机会耗尽燃油。在任何旅行中,司机永远不应该在沿途行驶超过dd个单位而不经过休息区,包括旅程的开始或结束。目标是找出最小的dd,假设休息区被以最佳方式放置。

思路讲解

https://hackmd.io/@tmt514/Bk_lRqjill#Problem-J—Gas-Station

说白了,只要每一颗子树都最小化加油站数量,然后我们再检测在最小化加油站数量前提下,是否违反了限制

贪心的关键是,找到最优子结构。最优子结构是什么?就是在不在这贪取决于什么!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
auto dfs=[&](auto && self,ll u,ll p) -> ll {
ll dis=0;
ll plus=0;
for (auto [v,w]:g[u]) {
if (v==p) continue;
ll ldis=self(self,v,u);
ldis+=w;
// 如果说 ldis 本身就大于 d 这个门槛呢?那么给 v 节点加一个加油站
if (ldis>d_threshold) {
cnt_put++;
ldis=w;
}
// 如果说,ldis 和 最远子节点距离 (mx)dis 之间大于了 d 呢?
// 给 u 节点加一个加油站
if (ldis+dis>d_threshold) {
plus=1;
}
dis=max(dis,ldis);
}
cnt_put+=plus;
if (plus) {
return 0;
}
return dis;
};

AC代码

AC
https://codeforces.com/gym/106084/submission/361152548

心路历程(WA,TLE,MLE……)