算法题(145):货仓选址
审题:
本题需要我们找出距离之和的最小值思路:
方法一:贪心贪心策略:将货仓建立在所有商店的中间可以达到距离之和最小
因为每家商店都需要接收一车商品,所以这里的距离之和指的是从货仓到每一家商店的路线的距离之和
贪心证明:
数学公式:|a-x| + |b-x| >= |a-b|这个公式的意思是数轴上的a,b两点分别和数轴上任意一点之间的距离之和不小于a,b之间的距离,即一点x到a,b两点的距离之和在x位于a,b之间时最短
总和等于每条路线之和,只要每组商店组的路线都是最小值,那么总和也就是最小值。
所以只要货仓位于所有商店组(以1号商店与n号商店为第一组,依次从前面和后面选商店组队)中间,就可以达到目的。
当商店为奇数个:我们将货仓选在最中间的那个商店位置
当商店为偶数个:我们将货仓选在中间靠左边或靠右边的商店位置都可以,为了与奇数个求法对齐,我们选择靠左边的
解题:
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N = 1e5 + 10; int n; int a[N]; ll cnt; int main() {cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}sort(a + 1, a + 1 + n);//升序排序for (int i = 1; i <= n; i++){cnt += abs(a[i] - a[(1 + n) / 2]);}cout << cnt << endl;return 0; }