#include <iostream>
using namespace std;
int main()
{
long long hTree[210][2];
long long n;
cin>>n;
long long m=2*n-1;
for(long long i=1;i<=m;i++)
{
hTree[i][0]=0;
hTree[i][1]=0;
}
for(int i=1;i<=n;i++)
cin>>hTree[i][0];
long long min1,min2;
long long p,q;
for(long long i=n+1;i<=m;i++)
{
min1=99999999999;min2=999999999999;
for(long long j=1;j<=i-1;j++)
{
if(hTree[j][1]!=0)
continue;
if(hTree[j][0]<min1)
{
min1=hTree[j][0];
p=j;
}
}
for(long long j=1;j<=i-1;j++)
{
if(hTree[j][1]!=0)
continue;
if(hTree[j][0]<min2&&j!=p)
{
min2=hTree[j][0];
q=j;
}
}
hTree[i][0]=min1+min2;
hTree[p][1]=i;
hTree[q][1]=i;
}
long long sum=0;
for(long long i=n+1;i<=m;i++)
sum+=hTree[i][0];
cout<<sum;
return 0;
}
/*
赫夫曼树, n个子结点的赫夫曼树有2*n-1个结点,寻找最小的两个叶子结点,然后建立二叉树,继续寻找最小的叶子结点与该二叉树建立新的二叉树。
其中的贪心思想:每次都找最小的叶子结点。
*/
大佬代码:
#include <bits/stdc++.h>
using namespace std;
int a[105];
int main(){
int n;
cin>>n;
for(int i = 1; i <= n; i++)
cin>>a[i];
sort(a+1, a+1+n);
int sum = 0;
int temp = 0;
for(int i = 2; i <= n; i++){
temp = a[i] + a[i-1];
sum += temp;
a[i] = temp;
sort(a+i, a+n+1);
}
cout<<sum;
return 0;
}