三维空间上有N个点, 求一个点使它到这N个点的曼哈顿距离之和最小,输出这个最小的距离之和。
点(x1,y1,z1)到(x2,y2,z2)的曼哈顿距离就是|x1-x2| + |y1-y2| + |z1-z2|。即3维坐标差的绝对值之和。
Input
第1行:点的数量N。(2 <= N <= 10000) 第2 - N + 1行:每行3个整数,中间用空格分隔,表示点的位置。(-10^9 <= X[i], Y[i], Z[i] <= 10^9)
Output
输出最小曼哈顿距离之和。
Input示例
4 1 1 1 -1 -1 -1 2 2 2 -2 -2 -2
Output示例
18
思路:之前做过一个一维的,就是找中位数,那么三维的,取三个中位数,没毛病
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll a[10004]; 5 ll b[10004]; 6 ll c[10004]; 7 8 int main(){ 9 int n; 10 scanf("%d",&n); 11 for(int i=1;i<=n;i++){ 12 scanf("%lld%lld%lld",&a[i],&b[i],&c[i]); 13 } 14 sort(a+1,a+1+n); 15 sort(b+1,b+1+n); 16 sort(c+1,c+1+n); 17 ll x,y,z; 18 if(n%2==1){ 19 x=a[n/2+1]; 20 y=b[n/2+1]; 21 z=c[n/2+1]; 22 } 23 else { 24 x=(a[n/2]+a[n/2+1])/2; 25 y=(b[n/2]+b[n/2+1])/2; 26 z=(c[n/2]+c[n/2+1])/2; 27 } 28 ll sum=0; 29 for(int i=1;i<=n;i++){ 30 sum+=abs(x-a[i])+abs(y-b[i])+abs(z-c[i]); 31 } 32 cout<<sum<<endl; 33 }