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;

}

 

你可能感兴趣的:(哈夫曼树)