题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2527
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int main() {
priority_queue<int,vector<int>,greater<int> >q;
int t,m,sum;
string s ;
int vis[26];
scanf("%d",&t);
while(t--) {
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis));
scanf("%d",&m);
cin>>s;
for(int i=0; i<s.length() ; i++) {
vis[s[i]-'a']++;
}
for(int i=0; i<26; i++) {
if(vis[i]!=0)
q.push(vis[i]);
}
int ans=0,sum;
if(q.size()==1)
ans=q.top();
while(q.size() >1) {
int a=q.top() ;
q.pop();
int b=q.top();
q.pop();
sum=a+b;
ans+=sum;//搞不懂为啥求的是非叶子节点,而不是根节点。
q.push(sum);
}
if(ans <=m)
printf("yes\n");
else
printf("no\n");
}
}