2020牛客暑期多校训练营(第三场)E Two Matchings

E Two Matchings
给一个序列 a i a_i ai
要找到两种完全不同的两两匹配,使得所有两两匹配的差的和最小,输出这个和。

比赛的时候觉得是一个二分图最小权值环,但是点太多,没法用完全图最小费用流做。(HDU 1853

做出此题需要找到四个特性:

  • 1、此题等价于找一些长度为偶数的环使得这些环恰通过每个点一次, 且所有边的总权重最少。

  • 2、 2k 个点所构成的环的权重和的最小值为最大的权重减最小的权重。

  • 3、先把所有点的按照权重排序,最佳解一定是出现在每个环都是由排
    序后连续的点构成。

  • 4、若某个环长度 ≥ 8,总是可以拆成一些长度为 4 或 6 的环且总边 权更小。
    如果没观察到规律4,可以直接dp找最小值,类似斜率优化一下就可以 O ( n ) O(n) O(n)了。

for(int i=6; i<=n; i+=2) {
    f[i] = f[l] + (a[i] - a[l+1]) * 2;
            if(f[i-2] - a[i-1] * 2 < tmp) {
                l = i - 2;
                tmp = f[i-2] - a[i-1] * 2;
            }
        }

你可能感兴趣的:(贪心,dp)