HDU 1053 Entropy 하프 만 트 리

7681 단어 하프 만 나무
제목 링크: http://acm.hdu.edu.cn/showproblem.php?pid=1053
문 제 를 열심히 읽 고 문제 가 길 어 지 는 것 을 두려워 하지 마 세 요. 이 문 제 는 하 프 만 트 리 를 조사 하고 최소 인 코딩 값 을 구 하 는 것 입 니 다. 매번 배열 을 0 으로 정리 해 야 합 니 다. 그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다!
AC 코드:
#include<iostream>

#include<string.h>

using namespace std;

#define M 1000000

struct node

{

    int l,r,data,p;

}ha[100];

int main()

{

    //freopen("d:\\1.txt","r",stdin);

    char s[10000];

    int a[30],b[30];

    while(scanf("%s",s)!=EOF)

    {

        if(strcmp(s,"END")==0)break;

        memset(a,0,sizeof(a));  //   A  

        int i,j,m1,m2,x1,x2,s1=0,h;

        int l=strlen(s);

        for(i=0;i<l;i++)

        {

            if(s[i]!='_')

            a[s[i]-64]++;

            else

            a[0]++;

        }

        int k=0;

        for(i=0;i<30;i++)

        {

            if(a[i])b[++k]=a[i];

        }

        

        //      

        memset(ha,0,sizeof(ha));

        for(i=1;i<=k;i++)

         ha[i].data=b[i];

        for(i=1;i<k;i++)//       

        {

            m1=m2=M;

            x1=x2=0;

            for(j=1;j<k+i;j++)

            {

                if(ha[j].data<m1&&ha[j].p==0)

                {

                    m2=m1;

                    x2=x1;

                    m1=ha[j].data;

                    x1=j;

                }

                else if(ha[j].data<m2&&ha[j].p==0)

                {

                    m2=ha[j].data;

                    x2=j;

                }

            }

            ha[k+i].data=ha[x1].data+ha[x2].data;

            ha[k+i].l=x1;

            ha[k+i].r=x2;

            ha[x1].p=k+i;

            ha[x2].p=k+i;

        }

        

        if(k==1)//          

         s1=b[1]*1;

        else

        {

            for(i=1;i<=k;i++)

            {

                j=i;

                int x=0;

                for(;;)

                {

                    h=ha[j].p;

                    j=h;

                    x++;

                    if(h==2*k-1)break;                    

                }

                s1+=b[i]*x;

            }

        }

        printf("%d %d %.1lf
",l*8,s1,l*8*1.0/s1); } return 0; }

 

좋은 웹페이지 즐겨찾기