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*/

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;priority_queue<int, vector<int>, greater<int> >Q;//从小到大,优先队列char str[10001];
int huf[26];
int n;void solve()
{int ans=0;int a,b;while(Q.size()!=1){a=Q.top();//优先队列区最小的数(认为已经排好顺序了)
        Q.pop();b=Q.top();Q.pop();Q.push(a+b);//把新的根入队;ans+=(a+b);//本题要求的权值;
    }printf(ans<=n?"yes\n":"no\n");
}int main()
{int T,i,len;scanf("%d",&T);while(T--){while(!Q.empty())//保证队列为空
            Q.pop();memset(huf,0,sizeof(huf));scanf("%d",&n);scanf("%s",str);len=strlen(str);for(i=0;i<len;i++){huf[str[i]-'a']++;//统计各个字母的个数
        }for(i=0;i<26;i++)if(huf[i])//如果有字母就入队
                Q.push(huf[i]);if(Q.size()==1)//没有子叶的情况
        {int m=Q.top();Q.pop();printf(m<=n?"yes\n":"no\n");}elsesolve();}return 0;
}

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

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

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
struct node
{int weight;int parent,left,right;
};
char a[100001];
int huf(int str[],int size)
{int i,lenth=2*size,min1,min2,x,y,sum=0,j;struct node *hf;hf=(struct node *)malloc(lenth*sizeof(struct node));//开创for(i=size;i<lenth;i++){hf[i].weight=str[i-size];hf[i].parent=hf[i].left=hf[i].right=0;}for(i=size-1;i>0;i--){min1=min2=10000000;x=y=0;for(j=i+1;j<lenth;j++){if(min1>hf[j].weight&&hf[j].parent==0){min2=min1;y=x;min1=hf[j].weight;x=j;}else if(min2>hf[j].weight&&hf[j].parent==0){y=j;min2=hf[j].weight;}}hf[i].weight=min1+min2;sum=sum+hf[i].weight;hf[i].parent=0;if(x>y)swap(x,y);hf[i].left=y;hf[i].right=x;hf[x].parent=i;hf[y].parent=i;}return sum;
}
int main()
{int T,n,i,j,len,num[26],b[26];while(scanf("%d",&T)!=EOF){while(T--){len=0;memset(b,0,sizeof(b));scanf("%d",&n);getchar();scanf("%s",a);for(i=0;a[i]!='\0';i++)b[a[i]-'a']++;//把字母个数存入数组for(i=0;i<26;i++)if(b[i]!=0)num[len++]=b[i];//除去空字母if(len==1){if(num[0]<=n)printf("yes\n");elseprintf("no\n");} else{if(huf(num,len)<=n)printf("yes\n");elseprintf("no\n");}}}return 0;
}

转载于:https://www.cnblogs.com/yuyixingkong/p/3275774.html

Safe Or Unsafe(hdu2527)哈弗曼VS优先队列相关推荐

  1. HDU2527 Safe Or Unsafe【哈夫曼编码】

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

  2. hdu1053 Entropy hdu2527 Safe Or Unsafe

    裸裸的哈弗曼编码,求出哈弗曼编码的路径长度,注意整个字符串为一种字符的情况 View Code #include<iostream>#include<queue>#includ ...

  3. 哈弗曼树的带权路径长度

    最近刷题刷到了这一题,此题是北邮往年复试题,看了一些网上的讲解,大多数是方法比较复杂,有些巧妙的方法又往往却缺少解释,为了方便大家理解,给小伙伴们梳理梳理 题目描述: 哈夫曼树,第一行输入一个数n,表 ...

  4. 数据结构——哈弗曼编码问题

    实验六 基于哈夫曼树的数据压缩算法 [实验目的] 掌握哈夫曼树的构造算法. 掌握哈夫曼编码的构造算法. [实验内容] 问题描述 输入一串字符,根据给定的字符串中字符出现的频率建立相应的哈夫曼树, 构造 ...

  5. c语言文件压缩与解压缩实验报告,哈弗曼树的文件压缩和解压实验报告(C语言).doc...

    Lab05 树结构的应用 学号: 姓名: 实验时间:2011.5.24 1.问题描述 哈弗曼树的编码与译码 - 功能:实现对任何类型文件的压缩与解码 - 输入:源文件,压缩文件 - 输出:解码正确性判 ...

  6. Vijos P1097 合并果子【哈夫曼树+优先队列】

    描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...

  7. Python 数据结构与算法 —— 哈弗曼树

    1. 从扩充二叉树到哈弗曼树 扩充二叉树:对二叉树 TT,加入足够多的新叶节点(而不是任意),使 TT 的原有结点都变成度数为 2 的分支节点,得到的二叉树称为 TT 的扩充二叉树. 对于扩充二叉树而 ...

  8. 【DSA】树-哈弗曼树详解(3)

    什么是哈弗曼树 百度百科的定义 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长 ...

  9. python贪心算法几个经典例子_关于贪心算法的一些探讨、经典问题的解决和三种典型的贪心算法算法(哈弗曼,Kruskal,Prim)的Python实现。...

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是 ...

最新文章

  1. IBM又双叒叕要分拆了,IT基础设施部门将剥离,未来专注云计算和AI
  2. BIO bi_sector submit_bio make_request_fn
  3. boost::function模块boost::ref的测试程序
  4. Java多线程编程:变量共享分析(Thread)
  5. 低版本Eclipse如何快速设置黑色主题
  6. php aes 3des区别,AES和3DES之间的区别
  7. oracle desc卡,Oracle的一个bug,desc的bug,很夸张,这么基础的功能居然有bug
  8. 20180513 实参 形参
  9. Python笔记_第五篇_Python数据分析基础教程_文件的读写
  10. to teacher eulogy
  11. Mppt光伏最大功率点跟踪控制matlab仿真
  12. 三、数字图像处理之直方图规定化实例
  13. win2012 加入域
  14. 计算机重装系统后无法重启,u盘安装系统之后重启电脑没反应怎么办
  15. 计算机网络实验一 验证性实验
  16. iSCSI网络SCSI接口
  17. 菜鸟知识-五大智能手机操作系统
  18. Vue2.0开发之——购物车案例-Footer组件封装-计算商品的总价格(51)
  19. JavaScript中的异步、同步
  20. SCI论文发表的流程是怎样的?

热门文章

  1. 商业认知,你每天出门看天气吗?
  2. 一个人越来越有潜力的3个迹象
  3. 年轻人不要上来就说我要创业
  4. 家里电脑是win10,但开机都要3分钟,请问怎么提快电脑速度?
  5. 手机内存占用超过一半会不会卡?
  6. 952开头的电话一天响两三次,不是诈骗就是推销,请问该怎么屏蔽呢?
  7. 最长递增子序列(力扣)图解
  8. 挂载jffs2文件系统遇到的问题
  9. crontab下执行设置壁纸出错问题
  10. 关于微信小程序使用获取用户信息getUserProfile的问题:TypeError: wx.getUserProfile is not a function