题解 P7990 [USACO21DEC] Closest Cow Wins S
好题好题
思路过程
从敌人入手。
考虑如何放置自己人。
注意到,自己人的放置相对于敌人是具有独立性。即任意一个敌人分割开的两个区间中,我方部署互不影响。
同时由于具有独立性,所以满足dp或者分治的无后效性。
考虑dp。
考虑在相连两个敌人中如何放置我们自己的人,即每个子结构。
注意到在相邻两个敌人中,只需要放2个自己人。那么这相连两个人中的所有资源全是我们的了。
所以对于任意一个敌人区间,我们放置的自己人数量只能是\(\{0,1,2\}\)
可不可能放在敌人的位置上?不可能,因为在距离相同的情况下物资优先给敌人。
由于dp需要记录已经放了多少个人,所以复杂度为\(O(n^2)\),故dp不行。
考虑分治。使用主定理分析复杂度。
分治不行。
考虑反悔贪心。问题在与,每个选择之间存在关系,例如一个区间内部你只能放0,1,2其中一个数量。
反悔贪心不行。
注意到核心问题在与选择之间存在互斥关系:“我们不能同时选择放一个和两个”。
尝试处理互斥关系。
所以考虑拆开,把一次放两个转化为两次放一个。但是单纯的放两个的话,两个的收益可能有交集,那么我们预处理的时候就要分开。
但是此时产生了新的问题,将自己人的贡献分开,导致某些资源点的收益只被其中一个自己人覆盖,那么诺我们选择了另外一个自己人,答案就有问题。也就是说,互斥关系转化为了依赖关系。
考虑使用一维数据结构描述依赖关系。
我们要让被依赖的靠近一维数据结构的最左。
如何控制这一点?考虑排序,我们要让被依赖的权值最大,我们可以按照资源点的贡献排序。即我们在预处理的时候,对于同时让两个自己人收录的资源点,要归属于那个权值更大的自己人。
然后所有的依赖是互相独立的,所以我们可以让所有的依赖合并为一个数组。
考虑怎么在这个数组中选择。
注意到已经排序了,所以可以使用交换论证证明最优选择必然是从最左边连续的选择。
所以直接从最左端连续选n个即可。
我们已经排序了,直接选前n个即可。
收获(或者说经验)
-
同一个问题,从多方面入手。(在这个题解中一开始就说从敌人入手,其实我已经把其他入手方式全试了一遍了)
-
从“找算法”提升到“找结构”,在这个题目中,核心的突破均来源于结构和性质的发现,而非猜测什么算法或者套路
-
注意到dp和贪心是高度相关的,很多结论和性质可以互通
-
不要过早否定一个方向(我要是一开始就给贪心否定了,这题没法做了)

浙公网安备 33010602011771号