哈夫曼树
就是对于给定的若干个字符,每个字符出现的频率不同,对每个字符进行编码,使得占用内存最少,
将点按照频率由小到大排序,然后贪心的选择两两合并,使得权值乘路径之和最小。
#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; }
想的太多,做的太少;