来源:POJ3253
水题,每次取最短的棍子即可。。。优先队列
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN=20020;
priority_queue<int,vector<int>,greater<int> >pq;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int i,d1;
for(i=0;i<n;i++)
{
scanf("%d",&d1);
pq.push(d1);
}
long long ans=0;
int d2;
d1=d2=0;
while(pq.size()>1){
d1=pq.top();
pq.pop();
d2=pq.top();
pq.pop();
ans+=(d1+d2);
pq.push(d1+d2);
}
printf("%lld",ans);
}
return 0;
}