这道题的思路有点怪 哈夫曼树的思路
先取两个最小的,再把这两个的和加入队列,把这两个小的数弹出队列
#include<iostream>
#include<cstdlib>
#include<sstream>
#include<cstdio>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;
/*
3
8
5
5
*/
//先从无限长的木板上锯下长度为21的木板,花费21
//再从长度为21的木板上锯下长度为5的木板,花费5
//再从长度为16的木板上锯下长度为8的木板,花费8
//总花费34
priority_queue<int,vector<int>,greater<int> >q;
int t1,t2,t;
signed main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&t);
q.push(t);//入队
}
int sum=0;
if(q.size()==1)
{
t1=q.top();
sum+=t1;
q.pop();
}
else{
while(q.size()>1)
{
t1=q.top();
q.pop();
t2=q.top();
q.pop();
t=t1+t2;
sum+=t;
q.push(t);
}
}
cout<<sum<<endl;
return 0;
}