http://wikioi.com/problem/1063/
// File Name: 1063.cpp
// Author: bo_jwolf
// Created Time: 2013年08月13日 星期二 19时55分50秒
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
#define maxn 10005
using namespace std;
int heap[ maxn ] , length ;
void min_heapify( int i )
{
int l = i << 1 ;
int r = l + 1 ;
int min = i ;
if( l <= length && heap[ l ] < heap[ min ] )
{
min = l ;
}
if( r <= length && heap[ r ] < heap[ min ] )
{
min = r ;
}
if( i != min )
{
int temp = heap[ i ] ;
heap[ i ] = heap[ min ] ;
heap[ min ] = temp ;
min_heapify( min ) ;
}
}
void sinkup( int i )
{
int parent = i >> 1 ;
if( heap[ parent ] > heap[ i ] )
{
int temp = heap[ i ] ;
heap[ i ] = heap[ parent ] ;
heap[ parent ] = temp ;
if( parent > 1 )
sinkup( parent ) ;
}
}
void min_build()
{
for( int i = length / 2 ; i >= 1 ; i-- )
{
min_heapify( i ) ;
}
}
int main()
{
int n , ans , temp ;
while( scanf( "%d" , &n ) != EOF )
{
for( int i = 1 ; i <= n ; ++i )
{
scanf( "%d" , &heap[ i ] ) ;
}
length = n ;
min_build() ;
ans = 0 , temp = 0 ;
while( length > 1 )
{
if( length == 2 )
{
ans += heap[ 1 ] ;
ans += heap[ 2 ] ;
break ;
}
ans += heap[ 1 ] ;
temp += heap[ 1 ] ;
heap[ 1 ] = heap[ length ] ;
length-- ;
min_heapify( 1 ) ;
ans += heap[ 1 ] ;
temp += heap[ 1 ] ;
heap[ 1 ] = heap[ length ] ;
length-- ;
min_heapify( 1 ) ;
length++ ;
heap[ length ] = temp ;
sinkup( length ) ;
temp = 0 ;
}
printf( "%d\n" , ans ) ;
}
return 0;
}