合并果子 https://vjudge.net/problem/CSU-1588
现在有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<iostream>
#include<queue>
using namespace std;
int main()
{
priority_queue <int,vector<int>,greater<int> >q;
int NN;
cin>>NN;
int n;
for(int i=0;i<NN;i++)
{
cin>>n;
while(q.size()) q.pop();
int t,sum=0,t1,t2;
for(int j=0;j<n;j++)
{
cin>>t;
q.push(t);
}
while(q.size()>1)
{
t1=q.top(); q.pop();
t2=q.top(); q.pop();
t=t1+t2;
q.push(t);
sum+=t;
//cout<<sum<<endl;
}
cout<<sum<<endl;
}
}