我們寫一下就可以發現:
假設符合要求的點的座標爲(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;
}