题意
n个点在一条直线上的不同位置,选出k个点对,使得点对间的距离和最小.要求每个点最多属于一个点对.
分析
贪心,但是显然每次选当前可选线段中的最短线段是不对的.
我们要考虑到把选择的线段”放回去”的过程.
- 当我们选择一条线段时,与这条线段相邻的两条线段显然不能再选.
- 当我们要放回一条线段时,只有当它两侧的线段同时被选.
当我们选择一条线段时,我们可以删除相邻的两条线断并添加一个新的元素:它的权值赋为左右两端线段权值之和减去当前线段权值.
这时当我们选择一个元素时就放弃了原来的线段而选择了它两侧的线段,线段数目加了一但是总权值增加了.
这样我们就可以用堆来实现了.
当然也可以用一些技巧用优先队列实现.
代码
1 | #include <cstdio> |