zoukankan      html  css  js  c++  java
  • 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 }



  • 相关阅读:
    xp下双开3389源码
    批处理加密解密原理
    Durango框架开源
    细说PHP5.3.4变量的引用赋值
    svnversion
    sqlite 的使用
    message日志_默认是一周一个日志,保存4周
    Smartmontool 使用
    NETRA之数据库处理
    mysql 日志转
  • 原文地址:https://www.cnblogs.com/hhxj/p/7050383.html
Copyright © 2011-2022 走看看