牛客题面:数据备份
思路:
总共 n n n 栋楼,要分配 k k k 条电缆给 k k k 对楼,每栋楼只能被配对一次。要使每对楼之间的距离总和最小。
容易想到,只有相邻的两栋楼来配对,最终得到的距离总和才会最小。
所以,我们可以将每相邻的两栋楼之间的距离预处理出来,再进行配对。
用一个数组 d d d 来存每一段距离, d [ i ] d[i] d[i] 表示第 i i i 栋楼与第 i − 1 i-1 i−1 栋楼之间的距离。
我们可以用一个小根堆来维护所有的 d d d,每次都选出最小的值,然后累加到答案中。但是,我们发现每栋楼只能被配对一次,如果单纯地这样维护,可能会有楼被重复配对。
这里有一个很强的性质:
- 若 d i d_i di 是最小值,则它可以被选择,且 d i − 1 d_{i-1} di−1 和 d i + 1 d_{i+1} di+1 不能选。
- 若不选 d i d_i di,则答案贡献中必须选择 d i − 1 d_{i-1} di−1 和 d i + 1 d_{i+1} di+1。
证明如下:
假设最小值 d i d_i