zoukankan      html  css  js  c++  java
  • CSA Round 84 Mahattan Center

    题目

    题目大意

    给定平面上的 $n$ 个点和常数 $k$,求 $x$ 轴上的点 $p$ 到 $n$ 个点中距其最近的 $k$ 个点的距离之和的最小值。两点之间的距离定义为曼哈顿距离。

    数据范围

    $1le k le n le 10^5$ 。

    点的坐标是 $1$ 到 $10^8$ 之间的整数。

    可能有重合的点。

    分析

    A optimization problem can have many possible solutions. Each solution has a value, and we wish to find a solution with the optimal (minimum or maximum) value. We call such a solution an optimal solution, as opposed to the optimal solution, since there may be several solutions that achieve the optimal value.

    对于这种类型的最优化问题(optimization problems),思考的大方向是「降低问题的自由度」。
    具体地说,找决策空间 $U$(或者称之为「状态空间」)的一个子集 $S$,使得 $S$ 满足:

    • 可以在 $S$ 中找到一个最优解
    • $S$ 中元素较少,遍历 $S$ 找最优解是可行的

    如果已经选定 $k$ 个点,要在 $x$ 轴上找一点 $p$ 使得 $p$ 到这 $k$ 个点的曼哈顿距离之和最小。这个问题相当于

    给定 $x$ 轴上的 $k$ 个点,在 $x$ 轴上找一点 $p$ 使得 $p$ 到这 $k$ 个点的距离之和最小。

    这是一个经典问题,解是这 $k$ 的点的中位点(median)。奇数个点的中位点是中间的那个点,偶数个点的中位点是中间的两个点之间的线段上的任意一点(包括两端点)。

    回到原问题,从上面的分析可以得到一个算法:枚举最优解中 $k$ 个点的横坐标的中位点。

    将给定的 $n$ 个点构成的(可重)集合记做 $P$,
    注意到对于 $n$ 个点中的任意 $k$ 个点,必然存在点 $p in P$ 使得 $p$ 的横坐标是选出的 $k$ 个点的横标做的中位点。

    所以我们只需要枚举点的横坐标即可。

    将 $n$ 个点按横坐标从小到大排序,依次记为 $p_1, p_2, dots, p_n$,设第 i 个点的坐标为 $(x_i , y_i)$ 。
    令 $L_i $ 为 $p_1, p_2, dots, p_{i-1}$ 中距 $(x_i,0)$ 最近的 $lfloor n/2 floor$ 个点与 $(x_i, 0)$ 的距离之和,$R_i$ 表示 $p_i, p_{i+1}, dots, p_n$ 中距 $(x_i, 0)$ 最近 $(x_i, 0)$ 最近的 $n - lfloor n/2 floor$ 个点与 $(x_i, 0)$ 的距离之和。

    答案即 $min_{1le i le n} L_i + R_i$

    参考实现


    ### Observation I

    点 $p$ 到 $k$ 个最近点的距离之和一定可以在 $p$ 的横坐标取为 $n$ 个点中某个点的横坐标时取到。

    ### Observation II

  • 相关阅读:
    第1章 CLR的执行模型
    第19章 可空值类型
    Servlet 3.0 特性
    java代码逆序输出再连篇
    java代码逆序输出数字
    java代码实现从键盘输入编号,输出价格,并且不再编号内的,无效输入!!!!
    java代码,实现输入编号,输出对应水果的单价~~~~
    java.输入水果的编号,求它对应的单价
    java.控制次数,每一组数都要计算。所以有个嵌套
    java练习,,,从键盘输入次数,输出最大值,和
  • 原文地址:https://www.cnblogs.com/Patt/p/9341097.html
Copyright © 2011-2022 走看看