现在有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
一开始的思路是赫夫曼树。但不太会编码。然后请教了一下各位大佬,get新方法,简洁好用的优先队列。
AC代码如下:
using namespace std;
priority_queue<int, vector<int>, greater<int> >x;
int main(){
int t,n,r,d,a,b; scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&r);
x.push(r);
}
d=0;
while(!x.empty())
{
a=x.top(); x.pop();
if(n==1) break;
b=x.top(); x.pop();
n--;
d+=a+b;
x.push(a+b);
}
printf("%d\n",d);
}
return 0;
}