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 }