首先,分析题目,我们可以得到,这道题的本质其实是寻找中间的数并求距离(绝对值)。 设有n个站点,且当他已经排好序,并设最距离为min。
但是,数的总数为偶数个时,最中间的数实际上有两个,因此,我们先可以用一个例子来分析(若是奇数个,那么中间的数就是数的总数n/2+1)。
输入样例:
4
1 2 3 4
输出样例:
4
我们求出中间的数为2和3,我们先当中间的数为2。 那么min=abs(2-1)+abs(2-2)+abs(2-3)+abs(2-4)=4。 在设中间数为3 那么min=abs(3-1)+abs(3-2)+abs(3-3)+abs(3-4)=4.
可知,当n%2==0时,中间数的可以用它们两个数之一(较小的数用n/2表示,较大的用n/2+1表示)
但我们知道输入不一定是排好序了的,因此我们需要排序。 有了思路,接下来是AC代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, ans = 0;
cin >> n;
int a[n + 1];
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + 1 + n};//排序
if (n % 2 == 1) { //判断为奇数
int k = n / 2 + 1;//求中间数的下标
for (int i = 1; i <= n; i++) {
ans += abs(a[k] - a[i]);
}
cout << ans;
} else { //偶数
int c = n / 2;//求中间数的下标
for (int i = 1; i <= n; i++) {
ans += abs{a[c] - a[i]);
}
cout << ans;
}
}
但是,我们在上面可以看到无论n是奇数或是偶数,中间的数都可以用n/2+1表示,因此,下面是改进的代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, ans = 0;
cin >> n;
int a[n + 1];
for (int i = 1; i <= n; i++) {
cin >》 a[i];
}
sort(a + 1, a + 1 + n);
int k = n / 2 + 1;
for (int i = 1; i <= n; i++) {
ans += abs【a(k] - a[i]);
}
cout << ans;
}```