1 条题解

  • 0
    @ 2025-11-11 16:03:17

    题目理解

    我们有 2N2N 枚硬币,初始位置在 (Xi,Yi)(X_i, Y_i),目标是将它们移动到 N×2N \times 2 的矩形区域:xx 坐标从 11NNyy 坐标只有 1122

    每次移动只能到相邻格子(上下左右),求最小移动次数。

    关键点

    • 网格无限大,但目标位置有限
    • 移动过程中允许多个硬币在同一格子
    • 最终每个目标格子恰好一枚硬币

    关键观察

    1. 曼哈顿距离的可分离性

    在网格中,从 (x1,y1)(x_1, y_1)(x2,y2)(x_2, y_2) 的曼哈顿距离为:

    x1x2+y1y2|x_1 - x_2| + |y_1 - y_2|

    重要性质xx 坐标的移动代价和 yy 坐标的移动代价可以分开计算。

    2. 问题分解

    我们可以将问题分解为两个独立的子问题:

    1. xx 坐标分配:将 2N2N 枚硬币分配到 xx 坐标 11NN,每个 xx 坐标分配 22 枚硬币
    2. yy 坐标分配:对于每个 xx 坐标,将 22 枚硬币分配到 yy 坐标 1122

    3. 独立求解

    对于 xx 坐标

    • 我们需要将 2N2NXiX_i 值匹配到 NN 个目标 xx 坐标,每个目标位置匹配 22 个硬币
    • 最小化 Xitargetx\sum |X_i - \text{target}_x|

    对于 yy 坐标

    • 对于每个固定的 xx 坐标,有 22 枚硬币需要分配到 y=1y=1y=2y=2
    • 最小化 Yitargety\sum |Y_i - \text{target}_y|

    算法设计

    1. xx 坐标的优化

    将所有的 XiX_i 排序,设排序后为 x1x2x2Nx_1 \leq x_2 \leq \cdots \leq x_{2N}

    关键定理:最优分配是将排序后的 xix_i 按顺序两两分组,每组分配到同一个目标 xx 坐标。

    更具体地说:

    • x1,x2x_1, x_2 分配到 x=1x=1
    • x3,x4x_3, x_4 分配到 x=2x=2
    • ...
    • x2N1,x2Nx_{2N-1}, x_{2N} 分配到 x=Nx=N

    证明思路:这相当于找 2N2N 个数到 NN 个点(每个点容纳 22 个数)的最小匹配,排序后顺序匹配是最优的。

    xx 坐标的总代价为:

    i=1N(x2i1i+x2ii)\sum_{i=1}^N (|x_{2i-1} - i| + |x_{2i} - i|)

    2. yy 坐标的优化

    对于每个目标 xx 坐标(即每组两枚硬币),我们需要将它们分配到 y=1y=1y=2y=2

    设这两枚硬币的原始 yy 坐标为 yay_ayby_b

    最优分配

    • yy 值较小的硬币分配到 y=1y=1
    • yy 值较大的硬币分配到 y=2y=2

    这样分配的代价为:

    ymin1+ymax2|y_{\min} - 1| + |y_{\max} - 2|

    如果反过来分配,代价为:

    $$|y_{\min} - 2| + |y_{\max} - 1| \geq |y_{\min} - 1| + |y_{\max} - 2| $$

    因为 yminymaxy_{\min} \leq y_{\max},所以上述不等式成立。

    3. 整合算法

    1. 预处理

      • 将所有硬币按 XX 坐标排序
      • 对于每组两个硬币,按 YY 坐标排序
    2. 计算总代价

      • 对于 ii11NN
        • xx 代价 +=X2i1i+X2ii+= |X_{2i-1} - i| + |X_{2i} - i|
        • y1=min(Y2i1,Y2i)y_1 = \min(Y_{2i-1}, Y_{2i}), y2=max(Y2i1,Y2i)y_2 = \max(Y_{2i-1}, Y_{2i})
        • yy 代价 +=y11+y22+= |y_1 - 1| + |y_2 - 2|
    3. 总代价 = xx 代价 + yy 代价

    正确性分析

    1. xx 坐标分配的正确性

    这是经典的"多对多"匹配问题。通过排序和顺序匹配,可以证明:

    • 任何交叉匹配都会增加总距离
    • 顺序匹配保证了全局最优性

    2. yy 坐标分配的正确性

    对于固定的两个 yy 坐标和两个目标位置:

    • 如果 yayby_a \leq y_b,那么:
      • 分配 (ya1,yb2)(y_a \to 1, y_b \to 2) 的代价:ya1+yb2|y_a-1| + |y_b-2|
      • 分配 (ya2,yb1)(y_a \to 2, y_b \to 1) 的代价:ya2+yb1|y_a-2| + |y_b-1|
    • 通过分类讨论可以证明前者总是更优

    复杂度分析

    • 排序O(NlogN)O(N \log N)
    • 代价计算O(N)O(N)
    • 总复杂度O(NlogN)O(N \log N),对于 N105N \leq 10^5 可以接受

    边界情况处理

    1. 坐标范围Xi,YiX_i, Y_i 可能为负数,但绝对值函数处理自然
    2. 大整数运算:结果可能很大,需要使用 long long
    3. 排序稳定性:对于 XX 坐标相同的硬币,需要稳定排序或同时考虑 YY 坐标

    算法步骤总结

    1. 读入数据:存储所有硬币的坐标
    2. XX 坐标排序:为 xx 坐标分配做准备
    3. 分组处理
      • 将排序后的硬币两两分组
      • 每组对应一个目标 xx 坐标
    4. 计算代价
      • 对每组计算 xx 坐标移动代价
      • 对每组计算 yy 坐标移动代价(按大小分配)
    5. 输出结果:累加所有组的代价

    总结

    这道题的核心在于利用曼哈顿距离的可分离性和排序匹配的最优性:

    1. 问题分解:将二维问题分解为两个一维问题
    2. 排序匹配:通过排序实现 xx 坐标的最优分配
    3. 贪心分配:对于 yy 坐标,按大小顺序匹配目标位置
    4. 独立优化:两个维度的代价可以独立计算后相加

    这种"维度分离 + 排序贪心"的思路在解决网格移动问题时非常有效,是算法竞赛中的重要技巧。

    • 1

    信息

    ID
    5241
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者