海贼OJ #251. 士兵 题解 排序+中位数(数学思维题)

题目链接: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;
}
posted @ 2025-01-07 16:50  quanjun  阅读(126)  评论(0)    收藏  举报