Title

CF1895B Points and Minimum Distance 题解

题目大意

已知有 $2n$ 个数,第 $i$ 个为 $a_i$,请你把这 $2n$ 个数划分成两组,每组 $n$ 个数,分别作为 $n$ 个点的横纵坐标,已知两个点 $(x_1,y_1)$ 和 $(x_2,y_2)$ 之间的距离为 $\left | x_1-x_2 \right|+\left| y_1-y_2 \right|$,请你找到一条路径经过所有的点,并最小化路径的长度。

解题思路

首先,我们对 $a$ 数组从小到大排序,把前 $n$ 个数作为 $x$、后 $n$ 个数作为 $y$,然后计算输出即可。

正确性证明

由路径长度的计算方式,易得当一条路径 $x$ 和 $y$ 均具有单调性时,路径长度最短。对于 $x$ 中最小的数 $x_{min}$ 和最大的数 $x_{max}$,显然,不管怎样,必然存在路径上的某一段横向长度为 $x_{max}-x_{min}$,显然此时直接从 $x_{min}$ 走到 $x_{max}$ 是最优的,纵向同理。综上,使得所有点的 $x$ 和 $y$ 坐标具有单调性的解法是最优的。那么,接下来需要考虑如何分配 $x$ 和 $y$。因为此时 $x$ 和 $y$ 需要具有单调性,那么总的路径长度为 $x_{max}-x_{min}+y_{max}-y_{min}$。设 $A$ 和 $B$ 为可能的 $x_{max}$ 和 $y_{min}$ 的值,其中 $A<B$。

当 $x_{max}=A$ 且 $y_{min}=B$ 时,总路径长度 $s_1=A-x_{min}+y_{max}-B$;当 $x_{max}=B$ 且 $y_{min}=A$ 时,总路径长度 $s_2=B-x_{min}+y_{max}-A$。此时有 $s_2-s_1=B-A+B-A=2(B-A)$,由 $B>A$ 知,$B-A>0$,所以 $s_2>s_1$,因此 $s_1$ 为更优解。综上,$x_{max}<y_{min}$ 时为最优解,即按照上面所讲的方式分配。

AC 代码

#include<stdio.h>
#include<math.h>
#include<algorithm>
#define N 205
int n,a[N];
int x[N],y[N];
inline void work(){
    scanf("%d",&n);
    for(register int i=1;i<=n<<1;++i)
        scanf("%d",&a[i]);
    std::sort(a+1,a+2*n+1);int ans=0;
    for(register int i=1;i<=n;++i)
        x[i]=a[i],y[i]=a[i+n];
    for(register int i=1;i<n;++i)
        ans+=x[i+1]-x[i]+y[i+1]-y[i];
    printf("%d\n",ans);
    for(register int i=1;i<=n;++i)
        printf("%d %d\n",x[i],y[i]);
}
signed main(){
    int T;scanf("%d",&T);
    while(T--) work();
} 
posted @ 2023-11-04 11:31  UncleSam_Died  阅读(24)  评论(0)    收藏  举报  来源