现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。
Input
第一行包含一个整数T(T<=50),表示数据组数。
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。
Output
每组数据仅一行,表示最小合并代价。
Sample Input
2 4 1 2 3 4 5 3 5 2 1 4
Sample Output
19 33
思路:每次都选最小的两堆
#include<cstdio>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<algorithm>
using namespace std;
#define INF 1<<28
static const int MAX = 1050;
int A[MAX];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
priority_queue<int, vector<int>, greater<int> > Q;
for (int i = 0; i < n; i++)
{
int a;
scanf("%d", &a);
Q.push(a);
}
int sum = 0;
for (int i = 0; i < n - 1; i++)
{
int p1 = Q.top(); Q.pop();
int p2 = Q.top(); Q.pop();
sum += p1 + p2;
Q.push(p1 + p2);
}
printf("%d\n", sum);
}
return 0;
}