51nod1108 距離之和最小 V2

這裏寫圖片描述

我們寫一下就可以發現:
假設符合要求的點的座標爲(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章