上课老师说了知道哈夫曼树叶子 不构图求二叉树的权 就是在构造哈夫曼树的时候运用构图的方法 把
每个结点的值加起来就是该数的权 证明 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; }