题解 P7990 [USACO21DEC] Closest Cow Wins S

好题好题

思路过程

从敌人入手。

考虑如何放置自己人。

注意到,自己人的放置相对于敌人是具有独立性。即任意一个敌人分割开的两个区间中,我方部署互不影响。

同时由于具有独立性,所以满足dp或者分治的无后效性。

考虑dp。

考虑在相连两个敌人中如何放置我们自己的人,即每个子结构。

注意到在相邻两个敌人中,只需要放2个自己人。那么这相连两个人中的所有资源全是我们的了。

所以对于任意一个敌人区间,我们放置的自己人数量只能是\(\{0,1,2\}\)

可不可能放在敌人的位置上?不可能,因为在距离相同的情况下物资优先给敌人。

由于dp需要记录已经放了多少个人,所以复杂度为\(O(n^2)\),故dp不行。

考虑分治。使用主定理分析复杂度。

分治不行。

考虑反悔贪心。问题在与,每个选择之间存在关系,例如一个区间内部你只能放0,1,2其中一个数量。

反悔贪心不行。

注意到核心问题在与选择之间存在互斥关系:“我们不能同时选择放一个和两个”。

尝试处理互斥关系。

所以考虑拆开,把一次放两个转化为两次放一个。但是单纯的放两个的话,两个的收益可能有交集,那么我们预处理的时候就要分开。

但是此时产生了新的问题,将自己人的贡献分开,导致某些资源点的收益只被其中一个自己人覆盖,那么诺我们选择了另外一个自己人,答案就有问题。也就是说,互斥关系转化为了依赖关系。

考虑使用一维数据结构描述依赖关系。

我们要让被依赖的靠近一维数据结构的最左。

如何控制这一点?考虑排序,我们要让被依赖的权值最大,我们可以按照资源点的贡献排序。即我们在预处理的时候,对于同时让两个自己人收录的资源点,要归属于那个权值更大的自己人。

然后所有的依赖是互相独立的,所以我们可以让所有的依赖合并为一个数组。

考虑怎么在这个数组中选择。

注意到已经排序了,所以可以使用交换论证证明最优选择必然是从最左边连续的选择。

所以直接从最左端连续选n个即可。

我们已经排序了,直接选前n个即可。

收获(或者说经验)

  • 同一个问题,从多方面入手。(在这个题解中一开始就说从敌人入手,其实我已经把其他入手方式全试了一遍了)

  • 从“找算法”提升到“找结构”,在这个题目中,核心的突破均来源于结构和性质的发现,而非猜测什么算法或者套路

  • 注意到dp和贪心是高度相关的,很多结论和性质可以互通

  • 不要过早否定一个方向(我要是一开始就给贪心否定了,这题没法做了)

posted @ 2026-07-29 21:45  txp2025  阅读(3)  评论(0)    收藏  举报