石子合并(一)
描述
有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程中任意两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
输入
测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
输出
输出总代价的最小值,占单独的一行
样例输入
3
1 2 3
样例输出
9
题解:这是石子合并最简单的题型,哈夫曼编码的变形,用贪心算法求得最优解。每次选两堆最少的,合并成新的一堆,直到只剩一堆。
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b){//qsotr()
return *(int *)a-*(int *)b;
}
int main(){
int n,i,j,ans=0;
scanf("%d",&n);//n个石子
int w[n];
for(i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(i=0;i<n-1;i++){
qsort(w,n,sizeof(w[0]),cmp);//每次进行排序,找最小的两堆石子
w[i+1]+=w[i];
ans+=w[i+1];//加上此次花费
}
printf("%d",ans);
}