HDU 1053 哈弗曼编码

贡献了10多次WA。。终于找到错误了!!!

全局定义了a 数组,又在局部定义了啊!!!伤不起啊!!有木有啊!!找了一个上午的错啊!!

 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<string>
#define inf 0x7fffffff
#define maxn 100005
using namespace std;
char s[maxn];
typedef struct node
{
    int w;
    node *lc;
    node *rc;
    friend bool operator<(const node &n1,const node &n2)
    {
        return n1.w>n2.w;
    }
}N;
priority_queue<node> q;
N huffman()
{
    N cur,next,a,*p1,*p2;
    cur=q.top();
    q.pop();
    while(!q.empty())
    {
        next=q.top();
        q.pop();
        p1=new N();
        p2=new N();
        p1->w=cur.w,p1->lc=cur.lc,p1->rc=cur.rc;
        p2->w=next.w,p2->lc=next.lc,p2->rc=next.rc;
        a.w=cur.w+next.w;
        a.lc=p1;
        a.rc=p2;
        q.push(a);
        cur=q.top();
        q.pop();
    }
    return cur;
}

int deep(N *x,int d)
{
    if(x->lc==NULL && x->rc==NULL)
    return d * x->w;
    else
    return deep(x->lc,d+1)+deep(x->rc,d+1);
}

int main() {
   freopen("in.txt","r",stdin);
   while(scanf("%s",s)==1&&strcmp(s,"END")!=0)
   {
       int i,j,len;
       len=strlen(s);
       int a[35];
       while(!q.empty())
       q.pop();
       memset(a,0,sizeof(a));
       for(i=0;i<len;i++)
       {
           a[s[i]-'A']++;
       }
       N x;
       j=0;
       for(i=0;i<31;i++)
       {
           if(a[i]!=0)
           {
              x.w=a[i];
              x.lc=NULL;
              x.rc=NULL;
              q.push(x);
              j++;
           }
       }
       if(j==1)
       {
           printf("%d %d 8.0\n",8*len,len);
           continue;
       }
       else
       {
           N ans=huffman();
           int sum=deep(&ans,0);
           printf("%d %d %.1lf\n",8*len,sum,8.0*len/(double)sum);
       }
   }
   return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值