原题传送门
套路贪心
先排序,成为一个有序数列
a
1
,
a
2
,
.
.
.
,
a
n
a_1,a_2,...,a_n
a1,a2,...,an
像这样子摆放,如何证明正确性呢
首先可以感性得知,如果是最优解,那么任意交换两个数的位置肯定比最优解劣
那么如果一种方案可以使得无法交换两个数来更优,那么这种方案是不是最优的,我觉得是的
所以可以任意交换,比如交换 a 4 , a 6 a4,a6 a4,a6,那么这一部分的最大值从 m a x ( a 8 − a 6 , a 6 − a 4 , a 4 − a 2 ) max(a8-a6,a6-a4,a4-a2) max(a8−a6,a6−a4,a4−a2)变成了 m a x ( a 8 − a 4 , a 6 − a 4 , a 6 − a 2 ) max(a8-a4,a6-a4,a6-a2) max(a8−a4,a6−a4,a6−a2)显然更劣了
Code:
#include <bits/stdc++.h>
#define maxn 10010
using namespace std;
int n, a[maxn], b[maxn];
inline int read(){
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
int main(){
n = read();
for (int i = 1; i <= n; ++i) a[i] = read();
sort(a + 1, a + 1 + n);
int l = 1, r = n;
for (int i = 1; i <= n; ++i)
if (i & 1) b[l++] = a[i]; else b[r--] = a[i];
for (int i = 1; i <= n; ++i) printf("%d ", b[i]);
return 0;
}