这个题用优先队列;
priority_queue <int, vector<int>, greater<int> > // int型降序优先队列
每次去连接最短的两根木棍,将连接完毕的木棍当成一根木棍放入所有的木棍中,然后再找最短的两根木棍连接
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<queue>
#include <vector>
using namespace std;
int main()
{
priority_queue <int, vector<int>, greater<int> >pp; // int型降序优先队列
int n;
scanf("%d",&n);
int a;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
pp.push(a);
}
long long sum=0;
while(!pp.empty())
{
int x=pp.top();
pp.pop();
int y=pp.top();
pp.pop();
sum+=(x+y);
if(pp.empty())//如果只剩下一根就不用再插入对列里了
break;
pp.push(x+y);
}
printf("%lld\n",sum);
}