質問: 104. 倉庫の場所の選択 - AcWing 質問バンク
アイデア:
-
すべてのポイントが並べ替えられました
-
偶数の場合は、中点2点間の倉庫を取ることで最小値を求めることができます。
-
奇数の場合は、倉庫から中央値を取得するだけです。
証明方法:
上記のアプローチが正しいのはなぜですか? -- 絶対値の不等式が使用されます。
f(x) =|xn - x| + |xn-1 - x| + |xn-2 - x| + ... |x1-x|
>= |xn - x1| + |xn-1 - x2| + ...
最小値は xn - x1 + xn-1 - x2 + ... です。
奇数は中央値、偶数は 2 つの中間点の間、または中央値 (a[n/2]) になります。要約すると、奇数でも偶数でも、すべての倉庫を計算できます。中央値と最小値を取得する
解決策: AcWing 104. 倉庫の場所の選択 (冬休み中は 1 日 1 問) - AcWing
理解できない場合は、ビデオを見てください、非常に明確です
コード:
#include <iostream>
#include <algorithm>
//贪心 绝对值不等式 104.货仓选址
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
scanf("%d", &n);//输入点个数
for(int i = 0; i < n; i++) scanf("%d", &a[i]);//输入点坐标
sort(a, a + n);
int res = 0;
for(int i = 0; i < n; i++) res += abs(a[i] - a[n / 2]);//循环n个, |a[i] - 中位数|
printf("%d\n", res);
return 0;
}