a:array[-2..10009] of longint;
procedure up(son:longint); //将数读入堆中
var t:longint;
begin
while (son<>1) and(a[son div 2]>a[son]) do
begin
t:=a[son div 2];
a[son div 2]:=a[son];
a[son]:=t;
son:=son div 2;
end;
end;
procedure down(h:longint); //将数取出堆,将最大的一个放在根节点,进行排序。
var fa,son,t:longint;
begin
fa:=h;
while (fa*2<=n)or (fa*2<=n) do
begin
if (fa*2+1>n) or(a[fa*2]<a[fa*2+1])
then son:=fa*2
else son:=fa*2+1;
if a[fa]>a[son]
then
begin
t:=a[fa];
a[fa]:=a[son];
a[son]:=t;
fa:=son;
end
else break;
end;
end;
begin
sum:=0;
readln(n);
read(a[1]);
for i:=2 to n do
begin
read(a[i]);
up(i);
end;
while n>1 do //取数
begin
s:=0;
s:=a[1];
a[1]:=a[n];
n:=n-1;
down(1); //取一个数排一次。
s:=s+a[1];
a[1]:=a[n];
n:=n-1;
down(1);
n:=n+1;
a[n]:=s;
sum:=sum+s; //保存消耗的体力
up(n);
end;
write(sum);
end.