题解:#3228.货仓选址 审核通过

lyh045 CSP-J2二等 2024-10-11 13:28:41 2024-10-11 21:21:13 5

首先,分析题目,我们可以得到,这道题的本质其实是寻找中间的数并求距离(绝对值)。 设有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; 
}```
{{ vote && vote.total.up }}