首页 > 代码库 > 1108 距离之和最小V2

1108 距离之和最小V2

1108 距离之和最小 V2技术分享

三维空间上有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 }

 




1108 距离之和最小V2