hdoj 2527 Safe Or Unsafe(哈弗曼算法)

Safe Or Unsafe

http://acm.hdu.edu.cn/showproblem.php?pid=2527

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1653    Accepted Submission(s): 662

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

HDU 2008-10 Programming Contest

Recommend

gaojie   |   We have carefully selected several similar problems for you:  2526 2522 2523 2524 2525

思路:哈夫曼树,拿出一串数中两个权值最小的,合成一个新的,再将这个新形成的加入到那个串中,再操作.......

STL中优先队列的使用方式:

[cpp] view
plain
copy

  1. #include <queue>
  2. priority_queue<int, vector<int>, greater<int>>
    Q;

#include<cstdio>

#include<cmath>

#include<cstring>

#include<cstdlib>

#include<vector>

#include<stack>

#include<queue>

#include<algorithm>

using namespace std;

const int M=10001;

char s[M];

int haffman[M];

int n;

priority_queue<int,vector<int>,greater<int> >Q;//STL中的优先队列

void init()

{

while(!Q.empty())

Q.pop();

memset(haffman,0,sizeof(haffman));

int len=strlen(s),i;

for(i=0;i<len;i++)

haffman[s[i]-‘a‘]++;

for(i=0;i<26;i++)

Q.push(haffman[i]);

}

void Haffman()

{

int ans=0;

 int a,b;//构造哈夫曼树中的思想

while(Q.size()!=1)//拿出一串数中两个权值最小的,合成一个新的,再将这个新形成的加入到那个串中,再操作..

{

a=Q.top();

Q.pop();

b=Q.top();

Q.pop();

ans+=(a+b);

Q.push(a+b);

}

if(ans<=n)

printf("yes\n");

else

printf("no\n");

}

int main()

{

int T;

scanf("%d",&T);

while(T--)

{

scanf("%d",&n);

scanf("%s",s);

init();

if(Q.size()==1)

{

int a=Q.top();

Q.pop();

if(a<=n)

printf("yes\n");

else

printf("no\n");

continue;

}

Haffman();

}

return 0;

}

时间: 2024-11-08 20:07:01

hdoj 2527 Safe Or Unsafe(哈弗曼算法)的相关文章

[Huffman]Hdu 2527 Safe Or Unsafe

1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <cstring> 5 #include <string> 6 using namespace std; 7 8 int t,len,k,num,sum; 9 int a[27]; 10 bool vis[27]; 11 string str; 12 priority_queue<int, vect

【算法设计与分析】8、哈弗曼编码,贪心算法实现

写这个玩意,我也是深深地感觉到自己数据结构的薄弱,可笑的是我一直以为学的还可以,结果一个堆结构就干了我半个月,才懂个大概= =,我也是醉了 BinaryTree.h二叉树的实现 /** * 书本:<算法分析与设计> * 功能:这个头文件是为了实现二叉树 * 文件:BinaryTree.h * 时间:2014年12月15日18:35:51 * 作者:cutter_point */ // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |

HDU-2527 Safe Or Unsafe

http://acm.hdu.edu.cn/showproblem.php?pid=2527 建哈夫曼树,哈夫曼编码,求wpl值. Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1511    Accepted Submission(s): 594 Problem Description Javac++

哈弗曼树的构建,哈夫曼编码、译码

哈夫曼树的基本概念 哈夫曼树(Huffman Tree),又叫最优二叉树,指的是对于一组具有确定权值的叶子结点的具有最小带权路径长度的二叉树. (1)路劲(Path):从树中的一个结点到另一个结点之间的分支构成两个结点间的路径. (2)路径长度(Path Length):路径上的分支树. (3)树的路径长度(Path Length of Tree):从树的根结点到每个结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. (4)结点的权(Weight of  Node):在一些

哈弗曼树及其操作

1.哈弗曼树的节点声明 1 package com.neusoft.Tree; 2 3 public class HuffmanNode { 4 public int weight; 5 //加入哈夫曼树的标志,flag=0表示该节点没有加入哈夫曼树,=1表示加入 6 public int flag; 7 public HuffmanNode parent,lchild,rchild; 8 public HuffmanNode() { 9 this(0); 10 } 11 public Huff

poj 1521Entropy(哈弗曼编码)

今天上机课写了这道题,已经是上上周留的作业了,有几天没刷算法题了,哈弗曼编码,贪心求解... 思路: 就是建立一个二维数组,一个保存权值w,另一个保存父节点坐标f,然后分别找到权值最小的两个点,生成 一个新的节点加入该数组中,将这两个最小的点从数组中删除一直这样循环,直到找不到两个没有父节点的点为止,就 是说到最后只有一个节点没有父节点.注意输入的字母只有一个的情况,我第一次提交wa就是在这个地方错误的. 构造哈弗曼树的方法是我从网上看来的,觉得这个方法挺好的,寻找两个最小的值时可以用m1,m2

优先队列实现哈弗曼最小权值

建立哈弗曼树要求我们每次都选频率权值最小的点构成节点,即权值小的点在树的深处,权值大的点在树的浅处,根据节点选择的特点,我们可以把节点的值放在优先队列中,包括新形成的节点. 我们先定义优先队列的优先级别. 1 struct cmp 2 { 3 bool operator()(const int &a,const int &b) 4 { 5 return a>b; 6 } 7 };//最小值优先出队 然后就是实现的整个程序. #include<stdio.h> #inclu

用哈弗曼编码实现文件压缩和解压

放假了把这个改一下,发现确实用单字节压缩的压缩率要高一些,暂时没去管为什么,不过放假静下心来写的话确实效率高很多. 新版详见:http://blog.csdn.net/tookkke/article/details/50575103 今天脑洞大开突然想写一下,明明都要考试了,唉,怎么就管不住这手啊  总之呢,就是根据每种编码的出现频率把等长的编码换成变长的,据说理论上压缩比率是比较高的,可是为什么经检验我这个大部分时候压缩出来的比源文件还大呢? 哈弗曼编码的时候要先做一颗字典树,查找的时候就按照

哈弗曼编码和译码.cpp

<span style="color:#6600cc;">#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ char a;//记录对应字符 int weight;//权值 int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char * *HuffmanCode;//动态分配数组存储哈夫