题目大意:给出一些数字,两两相加,把和代替两个数字放回原列,再继续两两相加。求最小和。
解题思路:正巧前两天学的哈夫曼树,一个思想,于是优先挑选最小的两个数,用优先队列不难实现
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> >q;
int main() {
int n, sum, tmp;
while (scanf("%d", &n) && n) {
for (int i = 0; i < n; i++) {
scanf("%d", &tmp);
q.push(tmp);
}
int a, b, c;
int sum = 0;
while (1) {
a = q.top();
q.pop();
if (q.empty()) break;
b = q.top();
q.pop();
c = a + b;
q.push(c);
sum += c;
}
printf("%d\n", sum);
}
return 0;
}