[AcWing 104] 货仓选址

image


点击查看代码
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1e5 + 10;

int n, res;
int a[N];

int main()
{
	cin >> n;
	for (int i = 0; i < n; i ++)	cin >> a[i];
	sort(a, a + n);
	int t = a[n / 2];
	for (int i = 0; i < n; i ++)	res += abs(t - a[i]);
	cout << res << endl;
	return 0;
}

  1. 算法思路
    最优位置是所有数的中位数,分为奇数个和偶数个两种情况:
    ① 若数的个数是奇数,中位数唯一
    ② 若数的个数是偶数,取中间的两个数其中之一即可
  2. 最优性证明
    设距离之和为 \(f\)\(x_i\) 为第 \(i\) 个点的坐标,$ x_1 \leqslant x_2 \leqslant \cdots \leqslant x_n $ ,
    $ f = |x_1 - x| + |x_2 - x| + \cdots + |x_n - x| = (|x_1 - x| + |x_n - x|) + (|x_2 - x| + |x_{n-1} - x| + \cdots ) \geqslant (x_n - x_1) + (x_{n-1} - x_2) + \cdots $
    取等号的前提是 \(x\) 位于区间 \([x_1,x_n], [x_2,x_{n-1}], \cdots\) 的内部,\(x\) 位于中位数的位置
posted @ 2022-06-14 21:30  wKingYu  阅读(32)  评论(0)    收藏  举报