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
和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 }
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 }