http://acm.hdu.edu.cn/showproblem.php?pid=2527
题意:建完树后,判断下除了叶子结点之外的其他结点之和是否大于题目给出的数字。
思路:如果了解哈夫曼树,就会知道,它是拿出一串数中两个权值最小的,合成一个新的,再将这个新形成的加入到那个串中,再操作.......
这样,就可以用优先队列来模拟建哈夫曼树的过程,从而ac此题。
注意:此题有坑,被它弄wa了2次,就是当它有n个a时,也要判断.......
例如:
4
5
aaaaa
yes
5
aaaaaa
no
#include<iostream>
#include<queue>
using namespace std;
struct ss
{
friend bool operator<(const ss a,const ss b)
{
if(a.v>=b.v)
return 1;
else
return 0;
}
int v;
};
int main()
{
int text,a[26];
char s[1000000];
scanf("%d",&text);
while(text--)
{
int sum=0;
priority_queue<ss>q;
memset(a,0,sizeof(a));
int n;
scanf("%d",&n);
scanf("%s",s);
int len=strlen(s);
int i;
for(i=0;i<len;i++)
{
a[s[i]-'a']++;
}
for(i=0;i<26;i++)
if(a[i]>0)
{
ss t;
t.v=a[i];
q.push(t);
}
if(q.size()==1)
{
if(len>n)
printf("no\n");
else
printf("yes\n");
}
else
{
while(q.size()!=1)
{
int tmp;
ss t,tmp1,tmp2;
tmp1=q.top();
q.pop();
tmp2=q.top();
q.pop();
tmp=tmp1.v+tmp2.v;
t.v=tmp;
sum+=tmp;
q.push(t);
}
if(n>=sum)
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}