我们先定义优先队列的优先级别。
1 struct cmp 2 { 3 bool operator()(const int &a,const int &b) 4 { 5 return a>b; 6 } 7 };//最小值优先出队
然后就是实现的整个程序。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> #define maxn 50050 using namespace std; struct cmp { bool operator()(const int &a,const int &b) { return a>b; } }; int main() { int n; while(scanf("%d",&n)!=EOF) { int x; priority_queue<int,vector<int>,cmp>q; for(int i=0;i<n;i++) { scanf("%d",&x); q.push(x); } __int64 sum=0; while(q.size()!=1) { int a=q.top(); q.pop(); int b=q.top(); q.pop(); sum+=a+b; q.push(a+b); } printf("%I64d ",sum); } return 0; }
练习题链接
http://www.51nod.com/onlineJudge/questionCode.html#problemId=1117¬iceId=19046