题面:SOLDIERS
题目大意
有 n n n 个士兵,并且知道每个士兵在二维坐标图上的位置。
士兵可以进行移动,但是每个士兵每次只能向上、向下、向左或向右移动一个单位,因此,他的 x x x 或 y y y 坐标也将相应的加 1 或减 1。
现在希望通过移动士兵,使得所有士兵彼此相邻的处于同一条水平线内,即所有士兵的y坐标相同并且x坐标相邻。
请你计算满足要求的情况下,所有士兵的总移动次数最少是多少。
注意:两个或多个士兵不能占据同一个位置。
思路
分析题目,可以发现,每个士兵的横纵坐标对于他们的移动是彼此独立的,即一个士兵可以先移动好 x x x 坐标再移动 y y y 坐标,也可以先移动好 y y y 坐标再移动 x x x 坐标,或者可以交叉移动。
此时,我第一时间想到的就是货仓选址问题一样的做法,即排序找中位数求各个点到中点的距离之和的最小值。也容易发现,由于 y y y 要统一(即所有士兵最终的 y y y 坐标是一致的),所以在 y y y 轴上是可以这样做的。
但是 x x x 轴是按单位 1 递增排序的。所以需要稍微变形一下。
我们先试一下给 x x x 先排好序。
当 x x x 已经排好序之后,由于最终的 x x x 序列是一个公差为 1 的等差数列 a a a,所以排好序的 x x x 序列和最终要形成的序列其实是一一对应的,即: