Safe Or Unsafe(hdu2527)哈弗曼VS优先队列
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
/* 题意:就是给你一个字符串如: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优先队列相关推荐
- HDU2527 Safe Or Unsafe【哈夫曼编码】
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu1053 Entropy hdu2527 Safe Or Unsafe
裸裸的哈弗曼编码,求出哈弗曼编码的路径长度,注意整个字符串为一种字符的情况 View Code #include<iostream>#include<queue>#includ ...
- 哈弗曼树的带权路径长度
最近刷题刷到了这一题,此题是北邮往年复试题,看了一些网上的讲解,大多数是方法比较复杂,有些巧妙的方法又往往却缺少解释,为了方便大家理解,给小伙伴们梳理梳理 题目描述: 哈夫曼树,第一行输入一个数n,表 ...
- 数据结构——哈弗曼编码问题
实验六 基于哈夫曼树的数据压缩算法 [实验目的] 掌握哈夫曼树的构造算法. 掌握哈夫曼编码的构造算法. [实验内容] 问题描述 输入一串字符,根据给定的字符串中字符出现的频率建立相应的哈夫曼树, 构造 ...
- c语言文件压缩与解压缩实验报告,哈弗曼树的文件压缩和解压实验报告(C语言).doc...
Lab05 树结构的应用 学号: 姓名: 实验时间:2011.5.24 1.问题描述 哈弗曼树的编码与译码 - 功能:实现对任何类型文件的压缩与解码 - 输入:源文件,压缩文件 - 输出:解码正确性判 ...
- Vijos P1097 合并果子【哈夫曼树+优先队列】
描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...
- Python 数据结构与算法 —— 哈弗曼树
1. 从扩充二叉树到哈弗曼树 扩充二叉树:对二叉树 TT,加入足够多的新叶节点(而不是任意),使 TT 的原有结点都变成度数为 2 的分支节点,得到的二叉树称为 TT 的扩充二叉树. 对于扩充二叉树而 ...
- 【DSA】树-哈弗曼树详解(3)
什么是哈弗曼树 百度百科的定义 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长 ...
- python贪心算法几个经典例子_关于贪心算法的一些探讨、经典问题的解决和三种典型的贪心算法算法(哈弗曼,Kruskal,Prim)的Python实现。...
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是 ...
最新文章
- IBM又双叒叕要分拆了,IT基础设施部门将剥离,未来专注云计算和AI
- BIO bi_sector submit_bio make_request_fn
- boost::function模块boost::ref的测试程序
- Java多线程编程:变量共享分析(Thread)
- 低版本Eclipse如何快速设置黑色主题
- php aes 3des区别,AES和3DES之间的区别
- oracle desc卡,Oracle的一个bug,desc的bug,很夸张,这么基础的功能居然有bug
- 20180513 实参 形参
- Python笔记_第五篇_Python数据分析基础教程_文件的读写
- to teacher eulogy
- Mppt光伏最大功率点跟踪控制matlab仿真
- 三、数字图像处理之直方图规定化实例
- win2012 加入域
- 计算机重装系统后无法重启,u盘安装系统之后重启电脑没反应怎么办
- 计算机网络实验一 验证性实验
- iSCSI网络SCSI接口
- 菜鸟知识-五大智能手机操作系统
- Vue2.0开发之——购物车案例-Footer组件封装-计算商品的总价格(51)
- JavaScript中的异步、同步
- SCI论文发表的流程是怎样的?