AcWing 104. 货仓选址

原题链接

考察: 排序+贪心

因为做了七夕祭那道题,就把这道题重新做了一遍

这道题本质考察对中位数的了解

我们要求的答案是累加abs(s[i]-s[k]),i从1~n.

假设货仓位置为k,那么左侧距离和为p,右侧距离和为q,如果p>q,那么我们将仓库往右移动一点,使p减小;同理q>p.我们发现我们要求p+q的最小值就是当p=q的时候,y因此我们需要将货仓建在p=q的位置,而中位数的性质是离数组内所有数的距离最小.

以往我们求中位数是n为奇 k = n/2+1 ;

n为偶数 k = (n/2+n/2+1)/2

但是本题我们求的距离的累加和,可以发现中位数可以取n/2+1和n/2的位置,为了与奇数统一,可以直接取n/2+1的位置

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 100010;
 4 int store[N],avg;
 5 long long esum;
 6 int main()
 7 {
 8     int n;
 9     scanf("%d",&n);
10     for(int i=1;i<=n;i++) scanf("%d",&store[i]);
11     sort(store+1,store+1+n);
12     int avg = store[n/2+1];
13     for(int i=1;i<=n;i++) esum+=(long long)abs(avg-store[i]);
14     printf("%lld\n",esum);
15     return 0;
16 }

 

posted @ 2021-01-05 16:23  acmloser  阅读(84)  评论(0编辑  收藏  举报