#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int> v;
for(int i=0;i<n;i++)
{
int in;
cin>>in;
v.push_back(in);
}
int sum=0;
sort(v.begin(),v.end());
vector<int>::iterator it;
while(v.size()>=3)
{
sum+=v[0]+v[1];
int temp=v[0]+v[1];
it=v.begin();
v.erase(it);
it=v.begin();
v.erase(it);
int i=0;
while(temp>v[i]&&i<v.size())
{
i++;
}
v.insert(v.begin()+i,temp);
}
sum+=v[0]+v[1];
cout<<sum;
}
一堆// /**/是随机数调试的。。。。。。
简单贪心,要使总和最小,只需每次合并都挑最小的两个去合并。
再将合并之后的一堆插入排序,为下一次合并操作准备。
队列做法待更