1 条题解
-
0
题目理解
我们有 枚硬币,初始位置在 ,目标是将它们移动到 的矩形区域: 坐标从 到 , 坐标只有 和 。
每次移动只能到相邻格子(上下左右),求最小移动次数。
关键点:
- 网格无限大,但目标位置有限
- 移动过程中允许多个硬币在同一格子
- 最终每个目标格子恰好一枚硬币
关键观察
1. 曼哈顿距离的可分离性
在网格中,从 到 的曼哈顿距离为:
重要性质: 坐标的移动代价和 坐标的移动代价可以分开计算。
2. 问题分解
我们可以将问题分解为两个独立的子问题:
- 坐标分配:将 枚硬币分配到 坐标 到 ,每个 坐标分配 枚硬币
- 坐标分配:对于每个 坐标,将 枚硬币分配到 坐标 和
3. 独立求解
对于 坐标:
- 我们需要将 个 值匹配到 个目标 坐标,每个目标位置匹配 个硬币
- 最小化
对于 坐标:
- 对于每个固定的 坐标,有 枚硬币需要分配到 和
- 最小化
算法设计
1. 坐标的优化
将所有的 排序,设排序后为 。
关键定理:最优分配是将排序后的 按顺序两两分组,每组分配到同一个目标 坐标。
更具体地说:
- 将 分配到
- 将 分配到
- ...
- 将 分配到
证明思路:这相当于找 个数到 个点(每个点容纳 个数)的最小匹配,排序后顺序匹配是最优的。
坐标的总代价为:
2. 坐标的优化
对于每个目标 坐标(即每组两枚硬币),我们需要将它们分配到 和 。
设这两枚硬币的原始 坐标为 和 。
最优分配:
- 将 值较小的硬币分配到
- 将 值较大的硬币分配到
这样分配的代价为:
如果反过来分配,代价为:
$$|y_{\min} - 2| + |y_{\max} - 1| \geq |y_{\min} - 1| + |y_{\max} - 2| $$因为 ,所以上述不等式成立。
3. 整合算法
-
预处理:
- 将所有硬币按 坐标排序
- 对于每组两个硬币,按 坐标排序
-
计算总代价:
- 对于 从 到 :
- 代价
- 设 ,
- 代价
- 对于 从 到 :
-
总代价 = 代价 + 代价
正确性分析
1. 坐标分配的正确性
这是经典的"多对多"匹配问题。通过排序和顺序匹配,可以证明:
- 任何交叉匹配都会增加总距离
- 顺序匹配保证了全局最优性
2. 坐标分配的正确性
对于固定的两个 坐标和两个目标位置:
- 如果 ,那么:
- 分配 的代价:
- 分配 的代价:
- 通过分类讨论可以证明前者总是更优
复杂度分析
- 排序:
- 代价计算:
- 总复杂度:,对于 可以接受
边界情况处理
- 坐标范围: 可能为负数,但绝对值函数处理自然
- 大整数运算:结果可能很大,需要使用
long long - 排序稳定性:对于 坐标相同的硬币,需要稳定排序或同时考虑 坐标
算法步骤总结
- 读入数据:存储所有硬币的坐标
- 按 坐标排序:为 坐标分配做准备
- 分组处理:
- 将排序后的硬币两两分组
- 每组对应一个目标 坐标
- 计算代价:
- 对每组计算 坐标移动代价
- 对每组计算 坐标移动代价(按大小分配)
- 输出结果:累加所有组的代价
总结
这道题的核心在于利用曼哈顿距离的可分离性和排序匹配的最优性:
- 问题分解:将二维问题分解为两个一维问题
- 排序匹配:通过排序实现 坐标的最优分配
- 贪心分配:对于 坐标,按大小顺序匹配目标位置
- 独立优化:两个维度的代价可以独立计算后相加
这种"维度分离 + 排序贪心"的思路在解决网格移动问题时非常有效,是算法竞赛中的重要技巧。
- 1
信息
- ID
- 5241
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者