描述:就是构建哈夫曼树,然后再把构建哈夫曼树过程中出现的和(就是两个数字相加所得到的新的数字)全部相加就是要输出的结果了 #include <cstdio> #include <cstdlib> #include <algorithm> int cmp(const void *p1,const void *p2) { return *(int *)p1 - *(int *)p2; } int num[5010],score[100010]; int main() { //freopen("a.txt","r",stdin); int n,m,v,sum; while(scanf("%d",&n)!=EOF) { if(!n) break; for(int i=0; i<n; i++) scanf("%d",&num[i]); sum=0; while(1) { qsort(num,n,sizeof(int),cmp); score[0]=num[0]+num[1]; sum+=score[0]; m=0; v=1; for(int i=2; i<n; i++) { score[v++]=num[i]; if(i+1<n) { i++; score[v++]=num[i]; } qsort(score+m,v-m,sizeof(int),cmp); score[m+1]=score[m]+score[m+1]; m++; sum+=score[m]; } if(v-m<2) break; n=0; for(int i=m; i<v; i++) num[n++]=score[i]; } printf("%d\n",sum); } return 0; }