题目描述

         HDU 2527

分析

        霍夫曼编码的应用。
        本题没有必要构造一棵完整的霍夫曼树。只需利用霍夫曼编码的原理,每次挑选频率最低的两个元素进行合并。(显然,可以利用优先级队列,这里用数组来模拟)

源码

//每次挑出现频率最小的两个元素,应该用优先级队列!!!!!!!!!!

#include <stdio.h>
#include <limits.h>
#include <string.h>
int unionFre(int fre[26]); int main()
{
int frequency[26]; //记录每个字母出现的频率
int n;
int m;
char input[10000];
int letterNum; //出现的小写字母的个数
int len;
int result;
int i, j; scanf("%d", &n);
while (n --)
{
scanf("%d", &m);
scanf("%s", &input);
//初始化
memset(frequency, 0, sizeof(frequency)); //统计每个字母出现的次数
len = strlen(input);
for (i = 0; i < len; i ++)
{
frequency[input[i]-'a'] ++;
}
//没出现的字母频率均设为最大值
letterNum = 26;
for (i = 0; i < 26; i ++)
{
if (frequency[i] == 0)
{
letterNum --;
frequency[i] = INT_MAX;
}
} //如果字符串只由一个字母组成
if (letterNum == 1)
{
result = frequency[input[0]-97];
if (result <= m)
printf("yes\n");
else
printf("no\n"); continue;
} //循环(letterNum-1)次,每次挑选出现频率最低的两个元素进行合并
//并更新result值,加上被合并的两个元素的频率和
result = 0;
for (i = 0; i < letterNum-1; i ++)
{
result = result + unionFre(frequency);
} if (result <= m)
printf("yes\n");
else
printf("no\n");
} return 0;
} //合并函数
int unionFre(int fre[26])
{
int min, secondMin;
int minIndex, secondMinIndex;
int temp;
int i; min = fre[0];
minIndex = 0;
secondMin = fre[1];
secondMinIndex = 1; if (min > secondMin)
{
temp = min;
min = secondMin;
secondMin = temp; temp = minIndex;
minIndex = secondMinIndex;
secondMinIndex = temp;
} //找出频率最低的两个元素
for (i = 2; i < 26; i ++)
{
if (fre[i] < min)
{
secondMin = min;
secondMinIndex = minIndex; min = fre[i];
minIndex = i;
}
else if (fre[i] < secondMin)
{
secondMin = fre[i];
secondMinIndex = i;
}
} //合并两个元素
fre[minIndex] = min + secondMin;
fre[secondMinIndex] = INT_MAX; return (min + secondMin);
}


HDU 2527的更多相关文章

  1. HDU 1053 & HDU 2527 哈夫曼编码

    http://acm.hdu.edu.cn/showproblem.php?pid=1053 #include <iostream> #include <cstdio> #in ...

  2. hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)

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

  3. hdu 2527 Safe Or Unsafe (哈夫曼树)

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

  4. hdu 2527哈夫曼树(二叉树的运用)

    #include<stdio.h> #include<string.h> #define N  100 #define INF  2000000000  int b[N]; c ...

  5. hdu 2527 Safe Or Unsafe (优先队列实现Huffman)

    Safe Or UnsafeTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  6. 随手练——HDU Safe Or Unsafe (小根堆解决哈夫曼问题)

    HDU 2527 :http://acm.hdu.edu.cn/showproblem.php?pid=2527 哈夫曼树,学完就忘得差不多了,题目的意思都没看懂,有时间复习下,看了别人的才知道是怎么 ...

  7. HDU——PKU题目分类

    HDU 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 ...

  8. [转] HDU 题目分类

    转载来自:http://www.cppblog.com/acronix/archive/2010/09/24/127536.aspx 分类一: 基础题:1000.1001.1004.1005.1008 ...

  9. HDU ACM 题目分类

    模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...

随机推荐

  1. Lua for Windows入门01

    由于项目紧急,我都没来得及研究lua的基本知识就直接持枪上阵了.在实施编写的过程中,却次发现编程语言如此之美,第一次. 随着Lua+for+Windows+5.1.4-45版本的完全安装,最后跳出了一 ...

  2. jQ中prop与attr的区别

    1.prop适用于HTML元素本身就带有的固有属性 2.attr适用于HTML元素我们自定义的属性 <input type="checkbox" value="复选 ...

  3. Netty4.0学习教程

    http://blog.csdn.net/u013252773/article/details/21046697 一些属性和方法介绍 http://blog.csdn.net/zxhoo/articl ...

  4. [LeetCode]题解(python):140-Word Break II

    题目来源: https://leetcode.com/problems/word-break-ii/ 题意分析: 给定一个字符串s和一个字典dict(set),将所有将s有字典dict组成的结果输出. ...

  5. 为什么要for循环以及for循环的流程

    /* Name:为什么需要循环以及for循环流程 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月10日 03:16:55 Description:求1 ...

  6. 黑马12期day01之html&css

    html注释:<!-- --> html中不支持空格.回车.制表符都会被解析成一个空格 <pre></pre>标签内以上三个会被正常解析. <font> ...

  7. 一些特殊css

    属性 描述            outline  (轮廓)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用. outline:#00FF00 dotted thick; 可以按顺序 ...

  8. java 构造方法 constructor demo笔记

    demo 地址 http://pan.baidu.com/s/1bo2FG1T package com.ws.study; /** * @author Administrator * */ publi ...

  9. Google浏览器调试js

    1.进入source找到js位置 一般js文件就到js目录下找,tpl中的就到tpl中找. 我这次写在tpl中的,就到list中找,它就把list中的js单独显示出来了. 2.设置断点,进行排错.刷新 ...

  10. 收藏:左路Deep Learning+右路Knowledge Graph,谷歌引爆大数据

    发表于2013-01-18 11:35| 8827次阅读| 来源sina微博 条评论| 作者邓侃 数据分析智能算法机器学习大数据Google 摘要:文章来自邓侃的博客.数据革命迫在眉睫. 各大公司重兵 ...