题目链接:https://oj.haizeix.com/problem/251
解题思路:
最短总距离是所有点到中位数的距离之和。
对 \(y\):排序求中位数。
对 \(x\):对 \(x\) 排序,然后对排序后的 \(x_i - i\) 排序,然后求最短距离。
对 \(x_i - i\) 进行处理,能保证最终的 \(x_i\) 各不一样且相邻。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
long long cal(int a[], int n) {
long long ans = 0;
for (int i = 1, j = n; i < j; i++, j--)
ans += a[j] - a[i];
return ans;
}
int n, x[maxn], y[maxn];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d", x+i, y+i);
sort(x+1, x+n+1);
for (int i = 1; i <= n; i++)
x[i] -= i;
sort(x+1, x+n+1);
sort(y+1, y+n+1);
printf("%lld\n", cal(x, n) + cal(y, n));
return 0;
}
标签:排序,OJ,int,题解,中位数,long,ans,251,海贼
From: https://www.cnblogs.com/quanjun/p/18657955