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