#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
****************************************************************/