我们写一下就可以发现:
假设符合要求的点的座标为(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;
}