题目链接:https://www.acwing.com/problem/content/106/
解题思路:
首先对这些货舱从小到大排序;然后用2个游标分别指向最左端的点,最右端的点;然后直接将这2个端点的距离加到最终打答案上去,每加一次,将让2个游标向中间靠拢。
我们可以模拟一下货舱建立的过程,只要我们想一下图,或者画一下,就知道这样建立就是最优的。即直接加上每2个商店的间距,就是最终的答案。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 5;
LL a[maxn], p[maxn];
inline void quick_sort(int l, int r) {
if(l >= r) return;
int i = l - 1, j = r + 1;
LL x = a[l];
while(i < j) {
do i ++; while(a[i] < x);
do j --; while(a[j] > x);
if(i < j) swap(a[i], a[j]);
else break;
}
quick_sort(l, j);
quick_sort(j + 1, r);
}
inline void merge_sort(int l, int r) {
if(l >= r) return;
int mid = (l + r) >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1, k = 1;
for(; i <= mid && j <= r;)
if(a[i] < a[j]) p[k ++] = a[i ++];
else p[k ++] = a[j ++];
while(i <= mid) p[k ++] = a[i ++];
while(j <= r) p[k ++] = a[j ++];
for(i = l, k = 1; i <= r; i ++, k ++)
a[i] = p[k];
}
int main(void) {
// freopen("in.txt", "r", stdin);
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
if(n & 1) quick_sort(1, n);
else merge_sort(1, n);
LL sum = 0;
int i, j;
for(i = 1, j = n; i < j; i ++, j --)
sum += a[j] - a[i];
printf("%lld\n", sum);
return 0;
}