题目链接:http://poj.org/problem?id=3253
分析:每次找到最小的两根接到一起,将其放回,然后再选两个最小的接到一起,又放回....直到最后成了一根!!!
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<queue>
using namespace std;
const int maxn=1000000;
struct node {
__int64 k;
friend bool operator < (node x,node y) {
return x.k>y.k;
}
} f[maxn],rt;
priority_queue<node>M;
int main() {
int n; cin>>n;
while(!M.empty())M.pop();
for(int i=0; i<n; ++i) {
cin>>f[i].k;
M.push(f[i]);
}
__int64 sum=0;
while(M.size()>1) {
__int64 x,y;
x=M.top().k; M.pop();
y=M.top().k; M.pop();
sum+=x+y;
rt.k=x+y;
M.push(rt);
}
cout<<sum<<endl;
return 0;
}