题目来自:添加链接描述
这个题的思路不难理解,就是每次取最小的两个元素合并后重新放入序列中,再排序再取,如果直接用sort的话很明显每合并一次就要重新sort一次,这样会超时。
所以我们可以维护一个优先队列,按从小到大的顺序排列。
priority_queue<int, vector<int>, greater<int> > q;
一直取前两个元素,也就是最小的两个元素,求和后再加入优先队列。直到里面就一个元素就好了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
priority_queue<int, vector<int>, greater<int> > q;
int x,res=0;
for(int i=1;i<=n;++i){
cin>>x;
q.push(x);
}
while(q.size()>=2){
int a=q.top(); q.pop();
int b=q.top(); q.pop();
res+=a+b;
q.push(a+b);
}
cout<<res;
system("pause");
return 0;
}