【POJ 1723】SOLDIERS(排序、中位数)

博客探讨了如何通过排序和中位数计算方法解决士兵排列问题,确保他们在二维坐标系中相邻并处于同一水平线,同时最小化士兵的总移动次数。首先按 x 坐标排序,然后通过计算每个士兵到等差数列对应位置的距离和,找到最优解。
摘要由CSDN通过智能技术生成
题面: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 序列和最终要形成的序列其实是一一对应的,即:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值