/*
有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度
给定各个要求的小木板的长度,及小木板的个数n,求最小费用
3
8 8 5为例:
长度为 21 的木板,截成13和8花费 21
再从长度为13的木板上锯下长度为5的木板,花费13
共21+13 =34
*/
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{
int i,j,k,T;
__int64 num,sum=0;
while(cin>>T)
{
sum = 0;
//因为运算结果可能超过int,所以虽然输入不超过int,也必须定义为__int64
priority_queue <__int64, vector<__int64> ,greater<__int64> > q;//两个双尖括号中间必须有空格
while(T--)
{
cin>>num;
q.push(num);
}
// cout<<q.size()<<endl<<endl<<endl;
while(q.size()>1)
{
__int64 a = q.top();
q.pop();
__int64 b = q.top();
q.pop();
q.push(a+b);
sum+=a+b;
}
q.pop();
cout<<sum<<endl;
}
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 20001;
int n;
int blanks[MAX];
__int64 sum;
int main()
{
int i,j;
while(cin>>n)
{
sum = 0;
for(i = 0; i < n; i++)
{
cin>>blanks[i];
}
sort(blanks,blanks + n);
for(i = 1; i < n; i++)
{
blanks[i] += blanks[i-1];
sum += blanks[i];
for(j = i; j < n-1; j++)
{//不必每次排序,逐个比较插入新的数据
if(blanks[j] > blanks[j + 1])
swap(blanks[j],blanks[j+1]);
}
}
cout<<sum<<endl;
}
return 0;
}
//wa,理解错了题意,不存在无限长的木板,
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
__int64 ch[20005];
int cmp(const void *a,const void *b)
{
return *(__int64 *)a-*(__int64 *)b;
}
int main()
{
int i,j,k,T;
__int64 num,sum;
while(cin>>T)
{
memset(ch,0,sizeof(ch));
sum=0;
i=0;
while(T--)
{
cin>>num;
sum += num;
ch[i++]=num;
}
// cout<<sum<<endl;
qsort(ch,i,sizeof(__int64),cmp);
// for(k=0;k<i;k++)
// cout<<ch[k]<<endl;
for(j=0;j<i-1;j++)
sum+=ch[j];
cout<<sum<<endl;
}
return 0;
}