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; } 


原创粉丝点击