51nod1108 距离之和最小 V2

来源:互联网 发布:调音器软件下载 编辑:程序博客网 时间:2024/06/06 03:16

这里写图片描述

我们写一下就可以发现:
假设符合要求的点的坐标为(x, y, z); 那么ans = |x - x1| + |y - y1| + |z - z1| + |x - x1| + |y - y2| + |z - z2|……
由于求的是曼哈顿距离,x 和 y z坐标之间没有相互制约关系,所以让x y z 分别为xi yi zi(i = 1 2 3 ……)的中间点就好了

#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;const int maxn = 1e5;ll x[maxn], y[maxn], z[maxn];int main(){    ll n, ans = 0;    scanf("%lld", &n);    for(int i = 1; i <= n; i++){        scanf("%lld%lld%lld", &x[i], &y[i], &z[i]);     }    sort(x + 1, x + n + 1);    sort(y + 1, y + n + 1);    sort(z + 1, z + n + 1);    for(int i = 1; i <= n; i++){        if(i <= n / 2) ans -= x[i] + y[i] + z[i];        else if(n % 2 == 0 || i > n / 2 + 1){            ans += x[i] + y[i] + z[i];        }    }    printf("%lld\n", ans);    return 0;}
原创粉丝点击