题目链接
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1108
题意
三维空间上有N个点, 求一个点使它到这N个点的曼哈顿距离之和最小,输出这个最小的距离之和。
点(x1,y1,z1)到(x2,y2,z2)的曼哈顿距离就是|x1-x2| + |y1-y2| + |z1-z2|。即3维坐标差的绝对值之和。
题解
贡献来源于三个方面:
每个点x值与最优点的x坐标差,
每个点y值与最优点的y坐标差,
每个点z值与最优点的z坐标差。
这三个贡献是互不影响的。故可以将三维拆成三个一维考虑。
而一维坐标中最优点是中位数。
这个结论也很好理解。
初始只有两个点,那么最优位置肯定在两个的之间。
那么在最左边加一个点,再在最右边加一个点的呢?肯定还是在原来的位置是最优的。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+7;
int a[maxn],b[maxn],c[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[i]=x;
b[i]=y;
c[i]=z;
}
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
int p=n/2;
long long ans=0;
for(int i=0;i<n;i++)
{
if(i==p) continue;
ans+=abs(a[i]-a[p])+abs(b[i]-b[p])+abs(c[i]-c[p]);
}
printf("%lld\n",ans);
}
}