题意:一些数字两两相加,要求把每次两数相加的和全部加起来最小。
题解:优先队列会更好写,幸好数据量不是很大,所以数组代替,每次都挑数字中最小的两个相加,然后把和再放到数组里面,注意把和加入时保持数组的升序,然后每次的和都加起来得到结果。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 20000;
int main() {
long long sum, n, num[N], ans, front, rear, i, j;
while (scanf("%lld", &n) && n) {
for (i = 0; i < n; i++)
scanf("%lld", &num[i]);
sort(num, num + n);
ans = 0;
front = 0;
rear = n;
while (front + 2 <= rear) {
sum = num[front] + num[front + 1];
for (i = front + 2; i < rear; i++)
if (num[i] > sum)
break;
for (j = rear - 1; j >= i; j--)
num[j + 1] = num[j];
num[i] = sum;
front += 2;
rear++;
ans += sum;
}
printf("%lld\n", ans);
}
return 0;
}