HDU2527 构建哈夫曼树的灵巧运用

来源:互联网 发布:知联大厦 编辑:程序博客网 时间:2024/06/11 22:01

上课老师说了知道哈夫曼树叶子 不构图求二叉树的权 就是在构造哈夫曼树的时候运用构图的方法 把

每个结点的值加起来就是该数的权 证明 W=∑叶子权*该叶子层数 除了叶子的结点和就是这个树的权 

构造一个树就知道了 结点的权 肯定是下一层结点的和 就好像  W=∑叶子权*该叶子层数 这个公式运用了

乘法分配律一样=  = 

#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int cmp(int a,int b){    return a<b;}int main(){    int t,n,hf[30];char yl[1000];    cin>>t;    while(t--)    {        memset(hf,0,sizeof(hf));        cin>>n>>yl;        int len=strlen(yl);        for(int i=0;i<len;i++)        hf[yl[i]-'a']++;        for(int i=0;i<30;i++)        if(hf[i]==0)        hf[i]=99999999;        sort(hf,hf+30,cmp);        int ans=0;        if(hf[1]==99999999)      //这题有边界情况 如果没考虑这个  N=0  aaaaa的情况就会WA        ans=hf[0];        while(hf[1]!=99999999)           {            ans+=(hf[0]+hf[1]);            hf[0]+=hf[1];            hf[1]=99999999;            sort(hf,hf+30,cmp);        }        if(ans<=n)        printf("yes\n");        else        printf("no\n");    }    return 0;}


原创粉丝点击