AcWing_104 货仓选址(贪心)

AcWing

104. 货仓选址

对于两家商店和一个货仓,有两种情况:

  • 货仓在两家商店之间(包括边界),此时货仓到两个商店的距离之和恰好就是两个商店的距离;
  • 货仓在两家商店的左边或者右边,此时货仓到两个商店的距离之和一定大于两个商店之间的距离。

所以我们总是希望货仓的选址尽可能在多个商店的中间位置,这样的货仓到商店的总距离就是最小的。

对于本题,只需要给商店的坐标排序,取中位数,即为货仓的选址。再计算货仓到所有商店的距离总和。

#include <bits/stdc++.h>
using namespace std;
int n;
const int N = 100010;
int a[N];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n;
    for(int i = 0; i <= n - 1; i ++) cin >> a[i];
    sort(a, a + n);
    int mid = (n - 1) / 2;
    int res = 0;
    for(int i = 0; i <= n - 1; i ++) res += abs(a[mid] - a[i]);
    cout << res;
    return 0;
}