#include<cstdio>
const int maxn = 40000+5;
int L[maxn];
int N;
void swap(int& a, int& b){
int c = a;
a = b;
b = c;
}
void solve(){
long long ans = 0;
//求出最短的板m1和倒数第二短的板m2
while(N > 1){
int m1 = 0, m2 = 1;
if(L[m1] > L[m2]) swap(m1, m2);
for(int i = 2; i < N; i++){
if(L[i] < L[m1]){
m2 = m1;
m1 = i;
}
else if(L[i] < L[m2]){
m2 = i;
}
}
//将两板拼合起来
int t = L[m1] + L[m2];
ans += t;
if(m1 == N-1) swap(m1, m2);
L[m1] = t;
L[m2] = L[N-1];
N--;
}
printf("%lld\n", ans);
}
int main(){
while(scanf("%d", &N) == 1){
getchar();
for(int i = 0; i < N; i++){
scanf("%d", &L[i]);
getchar();
}
solve();
}
return 0;
}
POJ 3253
最新推荐文章于 2022-03-08 09:19:38 发布