hdu2527(哈夫曼树)
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; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。