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的更多相关文章
- HDU 1053 & HDU 2527 哈夫曼编码
http://acm.hdu.edu.cn/showproblem.php?pid=1053 #include <iostream> #include <cstdio> #in ...
- 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 (哈夫曼树)
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 2527哈夫曼树(二叉树的运用)
#include<stdio.h> #include<string.h> #define N 100 #define INF 2000000000 int b[N]; c ...
- hdu 2527 Safe Or Unsafe (优先队列实现Huffman)
Safe Or UnsafeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 随手练——HDU Safe Or Unsafe (小根堆解决哈夫曼问题)
HDU 2527 :http://acm.hdu.edu.cn/showproblem.php?pid=2527 哈夫曼树,学完就忘得差不多了,题目的意思都没看懂,有时间复习下,看了别人的才知道是怎么 ...
- HDU——PKU题目分类
HDU 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 ...
- [转] HDU 题目分类
转载来自:http://www.cppblog.com/acronix/archive/2010/09/24/127536.aspx 分类一: 基础题:1000.1001.1004.1005.1008 ...
- HDU ACM 题目分类
模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...
随机推荐
- Knuth-Morris-Pratt Algorithm
Today , 第一次学习KMP Algorithm,其中好多地方还是不能理解的透彻,本文将进一步对 KMP Algorithm 进行学习,搞清楚其中的思想…… First , KMP Algorit ...
- mina、netty消息边界问题(采用换行符)
在TCP连接开始到结束连接,之间可能会多次传输数据,也就是服务器和客户端之间可能会在连接过程中互相传输多条消息.理想状况是一方每发送一条消息,另一方就立即接收到一条,也就是一次write对应一次rea ...
- SQL Server 查看数据表占用空间大小的SQL语句
) ) if object_id('tempdb..#space') is not null drop table #space ),rows ),data ),index_size ),unused ...
- javascript笔记—面向对象
什么是对象: 对象是一个整体,对外提供一些操作. 什么是面向对象: 使用对象时,只关注对象提供的功能,不关注其内部细节,例如jquery 面向对象是一种通用思想,并非只有编程中能用,任何事情都可以用. ...
- Xcode GDB 命令list
此文下半部分为转载:但是这里有一些我自己使用技巧,结合下面的文章,我们会有更多的收获,在此感谢原创者. --------------------- 关于调试异常崩溃: 一般崩溃是由内存使用错误 ...
- http://www.swoole.com/
Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器, ...
- Android设置Activity背景为透明style
方法一: 通过Theme.Translucent @android:style/Theme.Translucent @android:style/Theme.Translucent.NoTitleBa ...
- 记WebUtility.HtmlDecode将 转成特殊空格的问题
在.net中 System.Web.HttpUtility.HtmlDecode(或者WebUtility.HtmlDecode) 方法会将 解码为特殊空格(Ascii值为,对应的值为:\u00A ...
- UVa1584 Circular Sequence
#include <stdio.h>#include <string.h> int less(char* str, size_t len, size_t p, size_t q ...
- c++ primer plus 习题答案(4)
p333.3 #include<iostream> #include<cstdlib> #include<cstring> #include<string&g ...