Official

C - 本棚の整理 / Organizing the Bookshelf Editorial by kyopro_friends


答えは \(\max_i V_i-\min_i V_i\) になります。

\(\max_i V_i-\min_i V_i\) を実現できること

\(V\) を降順にソートした列を \(A\) とすることで、

\(|A_1-A_2|+|A_2-A_3|+\dots+|A_{N-1}-A_N|\\ =(A_1-A_2)+(A_2-A_3)+\dots+(A_{N-1}-A_N)\\ =A_1-A_N\\ =\max_i V_i - \min_i V_i\)

となります。

\(\max_i V_i-\min_i V_i\) が最小であること

どのように並び替えても \(\max_i V_i-\min_i V_i\) 以上になることを示します。

\(V\) の並び替えである列 \(A\) を任意にとります。\(p,q\) を、\(A_p=\max_i V_i\)\(A_q=\min_i V_i\) を満たすように任意にとります。

\(p\leq q\) のとき
\(|A_1-A_2|+|A_2-A_3|+\dots+|A_{N-1}-A_N|\\ \geq |A_p-A_{p+1}|+\dots+|A_{q-1}-A_q|\\ \geq |A_p-A_q|\\ =A_p-A_q\\ =\max_i V_i - \min_i V_i\)
となります。(2つ目の不等号は三角不等式 \(|x-y|+|y-z|\geq |x-z|\) を繰り返し用いた)

\(p\geq q\) の場合も同様に示せます。

実装例

実装例 (C++)

#include<bits/stdc++.h>
using namespace std;

int main() {
  int n;
  cin >> n;

  vector<int> a(n);
  for(int i=0; i<n; i++) cin >> a[i];

  int max = *max_element(a.begin(), a.end());
  int min = *min_element(a.begin(), a.end());

  cout << max - min << endl;
}

実装例 (Python)

N = int(input())
A = list(map(int,input().split()))
print(max(A) - min(A))

posted:
last update: