http://acm.hust.edu.cn/vjudge/contest/view.action?cid=34121#problem/D
切木头,价值最大,用到优先队列
// File Name: d.cpp
// Author: bo_jwolf
// Created Time: 2013年10月16日 星期三 20:15:21
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
using namespace std;
int main(){
priority_queue<int, vector< int >, greater< int > > Q;
int n;
long long temp;
while( cin >> n ){
for( int i = 0; i < n; ++i ){
scanf( "%lld", &temp );
Q.push( temp );
}
long long ans = 0;
while( Q.size() != 1){
long long a = Q.top();
Q.pop();
long long b = Q.top();
Q.pop();
ans += a + b;
Q.push( a + b );
}
cout << ans << endl;
}
return 0;
}