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[];
int huf[];
int n; void solve()
{
int ans=;
int a,b;
while(Q.size()!=)
{
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,,sizeof(huf));
scanf("%d",&n);
scanf("%s",str);
len=strlen(str);
for(i=;i<len;i++)
{
huf[str[i]-'a']++;//统计各个字母的个数
}
for(i=;i<;i++)
if(huf[i])//如果有字母就入队
Q.push(huf[i]);
if(Q.size()==)//没有子叶的情况
{
int m=Q.top();
Q.pop();
printf(m<=n?"yes\n":"no\n");
}
else
solve(); }
return ;
}

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

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

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

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. 文本框仅可接收decimal

    文本框html如下: <div><label class="label">价格:</label><input id="TextP ...

  2. BZOJ百题版切计划(不咕)

    传送门 BZOJ 前言 听说最近要省选,那么我就写一下吧.QwQ! 1000 过于简单,不写了. 1001 不会对偶图,直接优化最小割 题解 1002 高精度套公式计算 题解 (Code by hey ...

  3. 【BZOJ2595】 [Wc2008]游览计划

    BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...

  4. [学习笔记]后缀自动机SAM

    好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...

  5. [JavaScript] 根据指定宽度截取字符串

    /** * 根据指定宽度截取字符串 * @param desc 原始字符串 * @param width 该显示的宽度 * @param fontsize 字体大小 12px * @returns { ...

  6. MySQL utilities介绍&出现 No module named utilities

    目录 安装 mysqlreplicate mysqlrplcheck mysqlrplshow mysqlrpladmin mysqlfailover mysqldbcompare 详细介绍 mysq ...

  7. SimpleVisitorMemberType类的visitClassType解读

    举个例子,如下: class CA<T>{ public T getVal(){ return null; } } interface IA{} interface IB{} public ...

  8. Hibernate的执行流程和集合的映射关系

    Hibernate的执行流程 集合映射 准被hibernate的运行环境 配置hibernate.cfg.xml主配置文件 1.Set集合 写User.java类 package com.gqx.co ...

  9. CentOS7安装sogou输入法

    centos7中自带的ibus用起来相当不爽,就决定自己换个搜狗,遇到阻力不少,在此记下,防止下次不会也给大家提供一些参考.(参见<kali下安装中文输入法>) 准备阶段: 安装fcitx ...

  10. Ansible中playbook的变量

    转自:http://www.cnblogs.com/lemon-le/p/6862788.html 先看看debug模块的使用: msg:输出调试信息 var:将某个任务执行的输出作为变量传给debu ...