题目链接: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;
}