题解 P1090 【合并果子】
//每次都选最小的两个,求和,得到一个新数,再重复
//第一次,我们用快排得到最小的两个数
//如何使这个新数有序,我们观察到原有序列是有序的,所以使用插入排序
//测试数据 3 1 5 4 6 2
//1 2 3 4 5 6
// 3 3 4 5 6 +3
// 4 5 6 6 +6
// 6 6 9 +9
// 9 12 +12
// 21 +21
#include <stdio.h>
//从小到大
void quickSort(int a[],int left,int right){
int i,j,temp,value;
if(left>=right) return ;
i=left;
j=right;
value=a[(i+j)/2];a[(i+j)/2]=a[i];a[i]=value;
while(i<j){
while(i<j&&a[j]>=value)j--;
a[i]=a[j];
while(i<j&&a[i]<=value)i++;
a[j]=a[i];
}
a[i]=value;
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
//插入排序
void insertSort(int a[],int n,int key){
int pos,i;
pos=0;
while(key>a[pos]&&pos<n)pos++;
if(pos==0){
a[-1]=key;
}else{
i=0;
while(i<=pos){
a[i-1]=a[i];
i++;
}
a[pos-1]=key;
}
}
int main()
{
int i,n,sum,key;
int a[10005];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
quickSort(a,0,n-1);
sum=0;
for(i=0;i<n-2;i++){
key=a[i]+a[i+1];
sum+=key;
//待排序的a数组,从位置a+2+i开始,长度为n-i-2
insertSort(a+2+i,n-i-2,key);
}
printf("%d",sum+a[n-2]+a[n-1]);
return 0;
}