Official
C - 本棚の整理 / Organizing the Bookshelf Editorial
by
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:
