来源:2010年北京邮电大学计算机研究生机试真题
基本思路就是建树,依次计算值
Code:
#include<stdio.h>#include<string.h>#include<stdlib.h>#define maxvalue 0x7fffffff //0x7fffffff表示 long int的最大值struct huffman{ int weight; int parent,lchild,rchild;}list[5000];int main(){ int n,m; int i,j; int ans; int x1,x2; int m1,m2; while(scanf("%d",&n)!=EOF) { m=2*n-1; //最多可能要用到2*n-1个节点 for(i=0;i<m;i++) list[i].parent=list[i].lchild=list[i].rchild=-1; //初始化为-1 for(i=0;i<n;i++) scanf("%d",&list[i].weight); //依次输入每个节点的值weight ans=0; for(i=0;i<n-1;i++) { x1=x2=0; m1=m2=maxvalue; for(j=0;j<n+i;j++) { if(list[j].weight<m1&&list[j].parent==-1) //如果小于当前最小的节点 { x2=x1; m2=m1; x1=j; m1=list[j].weight; } else if(list[j].weight<m2&&list[j].parent==-1) //如果大于当前最小节点但小于当前第二小节点 { x2=j; m2=list[j].weight; } } list[x1].parent=n+i; //标记为已经有parent 也就是表示已经用过这个数 list[x2].parent=n+i; list[n+i].lchild=x1; list[n+i].rchild=x2; list[n+i].weight=list[x1].weight+list[x2].weight; ans+=list[n+i].weight; } printf("%d\n",ans); } return 0;}
不建树简单一点
Code:
#include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int main() { int n,i,ans; int a[5000]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); ans=0; for(i=0;i<n-1;i++) { qsort(a+i,n-i,sizeof(a[0]),cmp); ans+=(a[i]+a[i+1]); a[i+1]+=a[i]; } printf("%d\n",ans); } return 0; }