题目 的 意思 是给你一串数字,然后然你按照某种顺序让他们分别a+b=sum;
sum+c=sum2;。。。。。。。
让这种加法的顺序使得所有的sum和最小,并输出 该和。
只需让每次加法得到的和最小,最后的和就最小。
解法连接:
http://blog.csdn.net/goomaple/article/details/7823607
/*
Name: UVA 10954 -ac 参考自net
Copyright: angieeve
Author: zj
Date: 09/04/13 22:32
Description: greedy
*/
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cmp(const void *a,const void *b){
return *(int *)a-*(int *)b;
}/very important
int N;
long long data[5010];
int main(){
long long ans;
long long temp;//逐步记录当前累积的值,
//与剩余未累加的值让两个最小的相加,一直加完,加到最后一个就是ans
while(cin>>N&&N){
for(int i=0;i<N;i++)
cin>>data[i];
ans=0;
temp=0;
qsort(data,N,sizeof(data[0]),cmp);//按数组的大小顺序排列。
for(int i=0;i<N-1;i++){
temp=data[i]+data[i+1];//前面已经是最小的数加起来的和存放在data【i+1】;
ans+=temp;
data[i+1]=temp;
for(int j=i+1;i<N;j++)//从i+1开始找出两个最小的。
if(temp<data[j]){
for(int k=i+1;k<j-1;k++)
data[k]=data[k+1];
data[j-1]=temp;
break;
}
else if(j==N-1){
for(int k=i+1;k<N-1;k++)
data[k]=data[k+1];
data[N-1]=temp;
break;
}
}
cout<<ans<<endl;
}
return 0;
}
/*1 2 3 4 5 6 7
3 3 4 5 6 7
6 4 5 6 7
4 5 6 6 7
9 6 6 7
6 6 7 9
12 7 9
7 9 12
16 12
28
*/