#include<iostream>
using namespace std;
int a[1005]; //每个人所需时间
//将过桥时间从小到大排序
void maopao(int a[],int n){
bool ok;
//进行N-1轮排序
for(int i=n-1;i>=1;i--){
ok=true;//假设没有交换
//每轮进行i次排序
for(int j=0;j<i;j++){
//大的数往下沉
if(a[j]>a[j+1]){
//相互交换 C++自带函数
swap(a[j],a[j+1]);
ok=false;//一旦发生过交换,标志设置成false,说明需要下一轮
}
}
//如果此轮没有发生过交换,说明数组已经排序完成
//无需下一轮比较跳出循环
if(ok==true)
break;
}
}
int main() {
int n;//n个旅行家
int sum=0;//过桥用的总时间
cin>>n;
//输入每个人的过桥时间
for(int i=0;i<n;i++)
cin>>a[i];
//过桥时间排序
maopao(a,n);
//如果超过4人
while(n >= 4)
{
//当方案1优于方案2
if((a[0]+a[n-2]) < (2*a[1]))
{
//将用时最长的2个人送到河对面
sum += a[n-1]; //用时最短和用时最长的一起过去
sum += a[0]; //用时最短的回来
sum += a[n-2]; //用时最短的和用时第二长的过去
sum += a[0]; //用时最短的回来
}
else
{
//同样也是将用时最长的2个人送到河对面
sum += a[1]; // 最短和第二短的人过去
sum += a[0]; //最短的回来送手电
sum += a[n-1]; //最长的和第二长的过去
sum += a[1]; //第二短的回来
}
//人数减少2人 :用时最长的2人已经被送过河了就不动他们了
n -= 2;
}
//如果n==3,用时最短的和用时最长的一起过去,然后用时最短的回来,再和剩下的一个人过去 ;
if(n == 3)
sum += a[1] + a[0] + a[2];
else if(n == 2)
sum += a[1];
else
sum += a[0];
cout<<sum<<endl;
}
/**************************************************************
Problem: 1235
User: admin
Language: C++
Result: Accepted
Time:8 ms
Memory:2076 kb
****************************************************************/