哈夫曼树

就是对于给定的若干个字符,每个字符出现的频率不同,对每个字符进行编码,使得占用内存最少,

将点按照频率由小到大排序,然后贪心的选择两两合并,使得权值乘路径之和最小。

 HDU - 2527 

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
char s[100];
int main(){
    int t,m;
    int b[30];
    while(~scanf("%d",&t)){

    while(t--){
        scanf("%d",&m);
        getchar();
        scanf("%s",s);
        memset(b,0,sizeof b);
            for(int i=0;s[i]!='\0';i++){
                b[s[i]-'a']++;
            }
        priority_queue<int,vector<int>,greater<int> >Q;
        int len=0;
        for(int i=0;i<26;i++){
            if(b[i])Q.push(b[i]),len++;
        }
        int sum=0;
        if(len==1)sum=Q.top();
        else {
            while(--len){
                sum+=Q.top();
                int cur=Q.top();Q.pop();
                sum+=Q.top();
                cur+=Q.top();Q.pop();
                Q.push(cur);
            }
        }
        if(sum<=m)puts("yes");
        else puts("no");
        }
}
    // system("pause");
    return 0;
}
View Code

 

posted @ 2020-05-16 23:30  无声-黑白  阅读(141)  评论(0编辑  收藏  举报