hdu 2527 Safe Or Unsafe (哈夫曼树)

Safe Or Unsafe

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1388    Accepted Submission(s): 544


Problem Description
Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一样的!并且当储存空间大于一定的值的时候是不安全的!所以Javac++ 就想是否有一种方式是可以得到字符编码最小的空间值!显然这是可以的,因为书上有这一块内容--哈夫曼编码(Huffman Coding);一个字母的权值等于该字母在字符串中出现的频率。所以Javac++ 想让你帮忙,给你安全数值和一串字符串,并让你判断这个字符串是否是安全的?
 

 

Input
输入有多组case,首先是一个数字n表示有n组数据,然后每一组数据是有一个数值m(integer),和一串字符串没有空格只有包含小写字母组成!
 

 

Output
如果字符串的编码值小于等于给定的值则输出yes,否则输出no。
 

 

Sample Input
2
12
helloworld
66
ithinkyoucandoit
 

 

Sample Output
no
yes
 

 

Source
 

 

Recommend
gaojie   |   We have carefully selected several similar problems for you:  2526 2524 2525 1024 1757 
 

 和hdu 1053 类似

模板原型:

priority_queue<T,Sequence,Compare>

T:存放容器的元素类型

Sequence:实现优先级队列的底层容器,默认是vector<T>

Compare:用于实现优先级的比较函数,默认是functional中的less<T>

常用的操作如下:

empty()  如果优先队列为空,则返回真 
pop()  删除第一个元素 
push()  加入一个元素 
size()  返回优先队列中拥有的元素的个数 
top()  返回优先队列中有最高优先级的元素 

但是在使用时必须注意:priority_queue放置元素时,不会判断元素是否重复。(因为在模板的第二个参数时顺序容器,不能保证元素的唯一性)此外可以替代默认的Compare函数

 1 //0MS    376K    1953 B    G++
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 typedef struct Huffman{
 7     int deep;
 8     int fred;
 9     Huffman *left,*right;
10     friend bool operator <(Huffman a,Huffman b){
11         return a.fred>b.fred;
12     }
13 }Huffman;
14 Huffman trie[10005];
15 Huffman *root;
16 int len,id,sum;
17 int cnt;
18 priority_queue<Huffman>Q;
19 
20 void huffman()
21 {
22     sum=0;
23     root=(Huffman*)malloc(sizeof(Huffman));
24     for(int i=0;i<id;i++) 
25         Q.push(trie[i]);
26     while(Q.size()>1){
27         Huffman *h1=(Huffman*)malloc(sizeof(Huffman));
28         *h1=Q.top();
29         Q.pop();
30         Huffman *h2=(Huffman*)malloc(sizeof(Huffman));
31         *h2=Q.top();
32         Q.pop();
33         
34         Huffman h3;
35         h3.left=h1;
36         h3.right=h2;
37         h3.fred=h1->fred+h2->fred;
38         Q.push(h3);
39     }
40     *root=Q.top();
41     Q.pop();
42     root->deep=0;
43     
44     queue<Huffman>q;
45     q.push(*root);
46     while(!q.empty()){
47         Huffman ht=q.front();
48         q.pop();
49         if(ht.left!=NULL){
50             ht.left->deep=ht.deep+1;
51             q.push(*ht.left);
52         }
53         if(ht.right!=NULL){
54             ht.right->deep=ht.deep+1;
55             q.push(*ht.right);
56         }
57         if(!ht.left && !ht.right){
58             sum+=ht.deep*ht.fred;
59         }
60     }   
61 }
62 int main(void)
63 {
64     char c[10005];
65     int t,n;
66     scanf("%d",&t);
67     while(t--)
68     {
69         scanf("%d%s",&n,c);
70         len=strlen(c);
71         c[len]='!';
72         sort(c,c+len);
73         cnt=1;
74         id=0;
75         for(int i=1;i<=len;i++)
76             if(c[i]!=c[i-1]){
77                 trie[id++].fred=cnt;
78                 cnt=1;
79             }else cnt++;
80         if(id==1){
81             if(len>n) puts("no");
82             else puts("yes");
83             continue;
84         }
85         huffman();
86         if(sum>n) puts("no");
87         else puts("yes");
88     }
89     return 0;
90 }
View Code
 1 //15MS    232K    984 B    G++    
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<queue>
 5 using namespace std;
 6 int main(void)
 7 {
 8     int t,n,r,len;
 9     int p[27];
10     char c[10005];
11     scanf("%d",&t);
12     while(t--)
13     {
14         memset(p,0,sizeof(p));
15         scanf("%d%s",&n,c);
16         len=strlen(c);
17         int judge=1;
18         for(int i=1;i<len;i++){
19             if(c[i]!=c[i-1]) judge=0; 
20         }
21         if(judge){
22             if(len>n) puts("no");
23             else puts("yes");
24             continue;
25         }
26         for(int i=0;i<len;i++)
27             p[c[i]-'a']++;
28         priority_queue<int,vector<int>,greater<int> >Q;
29         int sum=0;
30         for(int i=0;i<27;i++) 
31             if(p[i]) Q.push(p[i]);
32         while(Q.size()>1){
33             int a=Q.top();
34             Q.pop();
35             int b=Q.top();
36             Q.pop();
37             sum+=a+b;
38             Q.push(a+b);
39         }
40         if(sum>n) puts("no");
41         else puts("yes");
42     }
43     return 0;
44 }
View Code

 

 

 

posted @ 2014-04-10 22:48  heaventouch  阅读(340)  评论(0编辑  收藏  举报