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
和hdu 1053 类似
模板原型:
priority_queue<T,Sequence,Compare>
T:存放容器的元素类型
Sequence:实现优先级队列的底层容器,默认是vector<T>
Compare:用于实现优先级的比较函数,默认是functional中的less<T>
常用的操作如下:
empty() 如果优先队列为空,则返回真
pop() 删除第一个元素
push() 加入一个元素
size() 返回优先队列中拥有的元素的个数
top() 返回优先队列中有最高优先级的元素
但是在使用时必须注意:priority_queue放置元素时,不会判断元素是否重复。(因为在模板的第二个参数时顺序容器,不能保证元素的唯一性)此外可以替代默认的Compare函数
//0MS 376K 1953 B G++
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct Huffman{
int deep;
int fred;
Huffman *left,*right;
friend bool operator <(Huffman a,Huffman b){
return a.fred>b.fred;
}
}Huffman;
Huffman trie[];
Huffman *root;
int len,id,sum;
int cnt;
priority_queue<Huffman>Q; void huffman()
{
sum=;
root=(Huffman*)malloc(sizeof(Huffman));
for(int i=;i<id;i++)
Q.push(trie[i]);
while(Q.size()>){
Huffman *h1=(Huffman*)malloc(sizeof(Huffman));
*h1=Q.top();
Q.pop();
Huffman *h2=(Huffman*)malloc(sizeof(Huffman));
*h2=Q.top();
Q.pop(); Huffman h3;
h3.left=h1;
h3.right=h2;
h3.fred=h1->fred+h2->fred;
Q.push(h3);
}
*root=Q.top();
Q.pop();
root->deep=; queue<Huffman>q;
q.push(*root);
while(!q.empty()){
Huffman ht=q.front();
q.pop();
if(ht.left!=NULL){
ht.left->deep=ht.deep+;
q.push(*ht.left);
}
if(ht.right!=NULL){
ht.right->deep=ht.deep+;
q.push(*ht.right);
}
if(!ht.left && !ht.right){
sum+=ht.deep*ht.fred;
}
}
}
int main(void)
{
char c[];
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d%s",&n,c);
len=strlen(c);
c[len]='!';
sort(c,c+len);
cnt=;
id=;
for(int i=;i<=len;i++)
if(c[i]!=c[i-]){
trie[id++].fred=cnt;
cnt=;
}else cnt++;
if(id==){
if(len>n) puts("no");
else puts("yes");
continue;
}
huffman();
if(sum>n) puts("no");
else puts("yes");
}
return ;
}
//15MS 232K 984 B G++
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int main(void)
{
int t,n,r,len;
int p[];
char c[];
scanf("%d",&t);
while(t--)
{
memset(p,,sizeof(p));
scanf("%d%s",&n,c);
len=strlen(c);
int judge=;
for(int i=;i<len;i++){
if(c[i]!=c[i-]) judge=;
}
if(judge){
if(len>n) puts("no");
else puts("yes");
continue;
}
for(int i=;i<len;i++)
p[c[i]-'a']++;
priority_queue<int,vector<int>,greater<int> >Q;
int sum=;
for(int i=;i<;i++)
if(p[i]) Q.push(p[i]);
while(Q.size()>){
int a=Q.top();
Q.pop();
int b=Q.top();
Q.pop();
sum+=a+b;
Q.push(a+b);
}
if(sum>n) puts("no");
else puts("yes");
}
return ;
}
hdu 2527 Safe Or Unsafe (哈夫曼树)的更多相关文章
- hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 2527 Safe Or Unsafe (优先队列实现Huffman)
Safe Or UnsafeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 2527哈夫曼树(二叉树的运用)
#include<stdio.h> #include<string.h> #define N 100 #define INF 2000000000 int b[N]; c ...
- 两个队列+k叉哈夫曼树 HDU 5884
// 两个队列+k叉哈夫曼树 HDU 5884 // camp题解: // 题意:nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过TT, ...
- 贪心(哈夫曼树):HDU 5884 sort
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2QAAAKACAIAAAB8KCy/AAAgAElEQVR4nOy9a5Adx3UmWL+kHxuekU ...
- HDU 5884 Sort (二分+k叉哈夫曼树)
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...
- 哈夫曼树:HDU5884-Sort(队列、哈夫曼树)
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) 题目链接:http://ac ...
- (哈夫曼树)HuffmanTree的java实现
参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...
- 数据结构之C语言实现哈夫曼树
1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,……,kj, 使得 ki是ki+1 的双亲(1<=i<j),则称此结点序列是从 k1 到 kj 的路径. 从 ...
随机推荐
- hibernate中配置单向多对一关联,和双向一对多,双向多对多
什么是一对多,多对一? 一对多,比如你去找一个父亲的所有孩子,孩子可能有两个,三个甚至四个孩子. 这就是一对多 父亲是1 孩子是多 多对一,比如你到了两个孩子,它们都是有一个共同的父亲. 此时孩子就是 ...
- vue入门——组件基础todolist
1. 以下是 todolist 的例子,没有用到组件:下面的3 会通过组件拆分todolist <!DOCTYPE html> <html lang="en"&g ...
- SpringBoot学习(1)
springboot的自动配置功能,主要流程如下: 1 启动的时候加载我们的主配置类,也就是我们的入口类:从而开启我们的自动配置配置功能,这个是通过@EnableAutoConfiguration注解 ...
- 国内maven库链接地址,链接阿里的库,下载很快!!!
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http:/ ...
- MySQL学习路线图
- Flask初学者:url_for
URL反转:反转是指通过视图函数名称得到其对应的URL(有反转也就有正转,即通过URL得到视图函数返回的内容,也就是我们平时的访问网页了),需要“url_for(endpoint, **values) ...
- JS正则表达式笔记
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 正则 描述 ...
- intellij idea之git执行打标签(tag)和删除标签
intellij idea 版本为2017.2.6 进入Version Control-->log 1.在之前版本中,右键,新建标签 2.输入标签名称,建议输入版本号的方式 3.push标签 由 ...
- Android面试收集录 Android组件
1.请说出Android SDK支持哪些方式显示富文本信息? 使用TextView组件可以显示富文本信息,如果要实现图文混排,需实现ImageGetter接口 使用WebView组件显示HTML页面 ...
- VHDL入门学习-程序组成
1. VHDL程序的组成 一个完整的VHDL程序是以下五部分组成的: 2. 库(LIBRARY):比较好理解,调用系统已有的库,WORK库就是用户当前编辑文件所在的文件夹, IEEE库:由IEEE(美 ...