贪心算法—problem j

这个贪心算法就是普通的数据结构书都会介绍,就是根据出现频率每次选择两个最短的建立huffman树,消除两个插入一个,知道只能一个供选择为止!

#include
#include


 #include
using namespace std;


struct{
       int w;
       int p;
       int l;
       int r;
       }ASC[60];
int main()
{
    char ch[100000];
    int hash[35];
    int i,j,k;
    int lenght;
    while(cin>>ch,strcmp(ch,"END")!=0)
    {
        memset(hash,0,sizeof(hash));
        lenght=strlen(ch);
        for(i=0;i         {
            hash[ch[i]-64]++;
        }
        for(i=1,j=1;i<35;i++)
        {
            if(hash[i]!=0)
            {
                ASC[j].w=hash[i];
                ASC[j].p=ASC[j].l=ASC[j].r=0;
                j++;
            }
        }


        j--;


        for(i=j+1;i             ASC[i].p=ASC[i].l=ASC[i].r=0;


        for(i=j+1;i         {
            int m1,m2;
            m1=m2=999999;
            int x1,x2;
            for(k=1;k             {
                if(ASC[k].w                 {
                    m2=m1;
                    x2=x1;
                    m1=ASC[k].w;
                    x1=k;
                }
                else if(ASC[k].w                 {
                    m2=ASC[k].w;
                    x2=k;
                }
            }
            ASC[i].w=m1+m2;
            ASC[i].r=x1;
            ASC[i].l=x2;
            ASC[x1].p=i;
            ASC[x2].p=i;
        }


        int sum=0;
        int cnt;
        for(i=1;i         {
            k=i;
            cnt=0;
            while(ASC[k].p!=0)
            {
                k=ASC[k].p;
                cnt++;
            }
            sum+=cnt*ASC[i].w;
        }
        if(j==1)
            sum=lenght;
        float ratio;
        ratio=float(lenght*8)/sum;
        printf("%d %d %.1f\n",lenght*8,sum,ratio);
    }
    return 0;
}

你可能感兴趣的:(贪心算法)