Safe Or Unsafe

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

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
 
这几天在忙着看二叉树,,,╮(╯▽╰)╭   理解能力有待加强,,,
 
这道题的意思是 m与哈弗曼树除了叶子的权值(非叶子节点的权值之和);用优先队列模拟哈弗曼树;

/* 题意:就是给你一个字符串如:12     helloworld统计出其中d:1个,e:1个,h:1个,l:3个,o:2个,r:1个,w:1个,

然后用一个数组保存起来a[7]={1,1,1,1,1,2,3};然后就是用哈夫曼树的思想求出新建的非叶子节点的权值之和:sum与12相比较

如果sum小于等于12的话就输出yes否则输出no,此案例求出的sum=27;所以输出no。

思路:按照建立哈夫曼树的思路每次求出两个的权值用min1保存最小的,min2保存次小的,

然后(min1+min2)加入其中,但是min1和min2需要踢出去,此题我用优先队列做的,就是

每次弹出最小的(min1)和次小的(min2),然后把(min1+min2)压入队列中。//题中a=min1;b=min2;

但是有一组很坑爹的测试数据,开始的时候一直错,5 aaaaa 输出的是yes,5 aaaaaa输出的是no*/

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<queue>
  5. #include<iostream>
  6. using namespace std;
  7.  
  8. priority_queue<int, vector<int>, greater<int> >Q;//从小到大,优先队列
  9.  
  10. char str[];
  11. int huf[];
  12. int n;
  13.  
  14. void solve()
  15. {
  16. int ans=;
  17. int a,b;
  18. while(Q.size()!=)
  19. {
  20. a=Q.top();//优先队列区最小的数(认为已经排好顺序了)
  21. Q.pop();
  22. b=Q.top();
  23. Q.pop();
  24. Q.push(a+b);//把新的根入队;
  25. ans+=(a+b);//本题要求的权值;
  26. }
  27. printf(ans<=n?"yes\n":"no\n");
  28. }
  29.  
  30. int main()
  31. {
  32. int T,i,len;
  33. scanf("%d",&T);
  34. while(T--)
  35. {
  36. while(!Q.empty())//保证队列为空
  37. Q.pop();
  38. memset(huf,,sizeof(huf));
  39. scanf("%d",&n);
  40. scanf("%s",str);
  41. len=strlen(str);
  42. for(i=;i<len;i++)
  43. {
  44. huf[str[i]-'a']++;//统计各个字母的个数
  45. }
  46. for(i=;i<;i++)
  47. if(huf[i])//如果有字母就入队
  48. Q.push(huf[i]);
  49. if(Q.size()==)//没有子叶的情况
  50. {
  51. int m=Q.top();
  52. Q.pop();
  53. printf(m<=n?"yes\n":"no\n");
  54. }
  55. else
  56. solve();
  57.  
  58. }
  59. return ;
  60. }

       我的一道树的题目,纪念一下我的入门,,,哈哈

下面是用哈弗曼树写的,有点麻烦;感觉还是优先队列模拟的好,不过也可以参考一下哈

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdlib>
  4. using namespace std;
  5. struct node
  6. {
  7. int weight;
  8. int parent,left,right;
  9. };
  10. char a[];
  11. int huf(int str[],int size)
  12. {
  13. int i,lenth=*size,min1,min2,x,y,sum=,j;
  14. struct node *hf;
  15. hf=(struct node *)malloc(lenth*sizeof(struct node));//开创
  16. for(i=size;i<lenth;i++)
  17. {
  18. hf[i].weight=str[i-size];
  19. hf[i].parent=hf[i].left=hf[i].right=;
  20. }
  21. for(i=size-;i>;i--)
  22. {
  23. min1=min2=;
  24. x=y=;
  25. for(j=i+;j<lenth;j++)
  26. {
  27. if(min1>hf[j].weight&&hf[j].parent==)
  28. {
  29. min2=min1;
  30. y=x;
  31. min1=hf[j].weight;
  32. x=j;
  33. }
  34. else if(min2>hf[j].weight&&hf[j].parent==)
  35. {
  36. y=j;
  37. min2=hf[j].weight;
  38. }
  39. }
  40. hf[i].weight=min1+min2;
  41. sum=sum+hf[i].weight;
  42. hf[i].parent=;
  43. if(x>y)
  44. swap(x,y);
  45. hf[i].left=y;
  46. hf[i].right=x;
  47. hf[x].parent=i;
  48. hf[y].parent=i;
  49. }
  50. return sum;
  51. }
  52. int main()
  53. {
  54. int T,n,i,j,len,num[],b[];
  55. while(scanf("%d",&T)!=EOF)
  56. {
  57. while(T--)
  58. {
  59. len=;
  60. memset(b,,sizeof(b));
  61. scanf("%d",&n);
  62. getchar();
  63. scanf("%s",a);
  64. for(i=;a[i]!='\0';i++)
  65. b[a[i]-'a']++;//把字母个数存入数组
  66. for(i=;i<;i++)
  67. if(b[i]!=)
  68. num[len++]=b[i];//除去空字母
  69. if(len==)
  70. {
  71. if(num[]<=n)
  72. printf("yes\n");
  73. else
  74. printf("no\n");
  75. }
  76. else
  77. {
  78. if(huf(num,len)<=n)
  79. printf("yes\n");
  80. else
  81. printf("no\n");
  82. }
  83. }
  84. }
  85. return ;
  86. }

Safe Or Unsafe(hdu2527)哈弗曼VS优先队列的更多相关文章

  1. hdu 2527 Safe Or Unsafe (哈夫曼树)

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. HDU2527:Safe Or Unsafe(哈弗曼树)

    Problem Description Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一样的!并且当 ...

  3. HDU-2527 Safe Or Unsafe

    http://acm.hdu.edu.cn/showproblem.php?pid=2527 建哈夫曼树,哈夫曼编码,求wpl值. Safe Or Unsafe Time Limit: 2000/10 ...

  4. SLT 优先队列 哈弗曼树最小带权路径

    与普通的队列不同,普通的队列是先进先出的,而优先队列出队的顺序不是先进先出,而是大(或者小)元素先出队,需要#include <queue> 成员函数 成员函数 作用 empty() 判断 ...

  5. hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  6. hdu 2527 Safe Or Unsafe (优先队列实现Huffman)

    Safe Or UnsafeTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. K:哈弗曼树

    相关介绍:  树形结构除了应用于查找和排序等操作时能调高效率,它在信息通讯领域也有着广泛的应用.哈弗曼(Huffman)树就是一种在编码技术方面得到广泛应用的二叉树,它同时也是一种最优二叉树. 哈弗曼 ...

  8. POJ 3253 Fence Repair(简单哈弗曼树_水过)

    题目大意:原题链接 锯木板,锯木板的长度就是花费.比如你要锯成长度为8 5 8的木板,最简单的方式是把21的木板割成13,8,花费21,再把13割成5,8,花费13,共计34,当然也可以先割成16,5 ...

  9. POJ 1862 Stripies【哈夫曼/贪心/优先队列】

    Stripies Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18198   Accepted: 8175 Descrip ...

随机推荐

  1. DOM LEVEL 1 中的那些事儿[总结篇-下]

    本文承接:DOM LEVEL 1 中的那些事儿[上]   2.3 Element类型 Element类型应该是Document类型之外使用的最多的节点类型了,Element代表XML或HTML文档中的 ...

  2. 【新手向】阿里云上ubuntu+flask+gunicorn+nginx服务器部署(二)项目部署

    本项目实现的是类似于ins的图片分享网站.继续(一),当nginx的配置已修改好后,要在远程服务器上部署网站,只需要几个步骤: 1 前期准备 2 将运行网站的代码从github上下载过来 3 下载依赖 ...

  3. 3、JUC--ConcurrentHashMap 锁分段机制

    ConcurrentHashMap  Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能.  ConcurrentHashMap 同步容器 ...

  4. “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. 同一域名基于源ip地址分配给不同ip的dns配置--bind9.8.2

    1.安装bind.略. 2./etc/named.conf配置文件. // named.conf // // Provided by Red Hat bind package to configure ...

  6. 面试题-lazyMan实现

    原文:如何实现一个LazyMan 面试题目 实现一个LazyMan,可以按照以下方式调用: LazyMan('Hank'),输出: Hi, This is Hank! LazyMan('Hank'). ...

  7. 设计模式《JAVA与模式》之访问者模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要 ...

  8. POJ 2521

    #include <iostream> #include <stdio.h> using namespace std; int main() { //freopen(" ...

  9. MVC3学习:利用mvc3+ajax实现级联下拉列表框

    本例使用的是EF first code操作数据库. 一.准备数据库 级联下拉列表框,比较经典的就是省市数据表,在Model里同时创建三个类:province.cs.city.cs和dropContex ...

  10. (转)深入浅出 RPC - 深入篇

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mindfloating/article/details/39474123 <深入篇>我们 ...