HDU1053--哈夫曼树
来源:互联网 发布:淘宝月销量可以造假吗 编辑:程序博客网 时间:2024/05/22 00:34
#include<stdio.h> #include<stdlib.h> #include<string.h> struct { int data; int papa; }arr[1000]; int cmp(const void *a,const void *b) { return *(char *)a-*(char *)b; } int main() { int sum,s,i,k,len,p,min[2],vis[2],chang,j,pp; char c,str[100]; while(gets(str)){ if(!strcmp(str,"END"))break; k=0; pp=len=strlen(str); qsort(str,len,sizeof(char),cmp); c=str[0]; p=1; for(i=1;i<len;i++) { if(str[i]==c) p++; else { arr[k].data=p; arr[k++].papa=-1; c=str[i]; p=1; } if(i==len-1 ) { arr[k].data=p; arr[k++].papa=-1; } } if(k==1) { printf("%d %d 8.0\n",pp*8,pp); continue; } len=chang=k; while(len--!=1){ min[0]=min[1]=99999; for(i=0;i<k;i++) if(min[0]>arr[i].data && arr[i].papa==-1) { min[0]=arr[i].data; vis[0]=i; } for(i=0;i<k;i++) if(min[1]>arr[i].data && i !=vis[0] && arr[i].papa==-1) { min[1]=arr[i].data; vis[1]=i; } arr[k].data=min[0]+min[1]; arr[vis[0]].papa=arr[vis[1]].papa=k; arr[k++].papa=-1; } sum=0; for(i=0;i<chang;i++) { s=0; j=i; while(arr[j].papa!=-1) { s++; j=arr[j].papa; } sum+=s*arr[i].data; } printf("%d %d %.1f\n",pp*8,sum,(float)pp*8.0/(float)sum); } return 0; }