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

哈夫曼树,学完就忘得差不多了,题目的意思都没看懂,有时间复习下,看了别人的才知道是怎么回事。

贪心的题目,当总代价(要求最少)是由子代价累加或累乘出来,就可以考虑用哈夫曼来贪心。

题意: 就是给你一个字符串如: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。

解题思路:

建立小根堆,每次拿出来两个,并调整,再把这两个的和插入进去,直到数组长度为0。

我觉得这样要比建树来的思路清晰很多,当然前提是了解堆。

#include <string>
#include <map>
#include <iostream>
using namespace std; void heapify(int *a,int index ,int length) {
while (index * + < length) {
int left = index * + ;
if (left + < length&&a[left + ] < a[left])left++;
if (a[index] < a[left])break;
swap(a[index], a[left]);
index = left; }
} void heapinsert(int *a,int index) {
while (a[index] < a[(index - ) / ]) {
swap(a[index], a[(index - ) / ]);
index = (index - ) / ;
}
} int main() {
int N;
map<char, int>m;
cin >> N;
while (N--) {
string str;
int safe, res = ;
cin >> safe;
cin >> str;
for (int i = ; i < str.length(); i++) {
if (!m[str[i]]) m[str[i]] = ;
else m[str[i]]++;
}
int *a=new int[m.size()];
int length = ;
for (map<char, int>::iterator it = m.begin(); it != m.end(); it++) {
a[length++] = it->second;
}
for (int i = length / - ; i >= ; i--) {
heapify(a,i,length);
}
while (length > ) {
int m1 = a[];
swap(a[], a[length - ]);
heapify(a, , --length);
int m2 = a[];
swap(a[], a[length - ]);
heapify(a, , --length);
res += m1 + m2;
if (length == )break;
a[length] = m1 + m2;
heapinsert(a,length++);
}
if (res <= safe) {
cout << "yes" << endl;
}
else {
cout << "no" << endl;
}
m.clear();
}
}

随手练——HDU Safe Or Unsafe (小根堆解决哈夫曼问题)的更多相关文章

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

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

  2. scala写算法-用小根堆解决topK

    topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...

  3. 优先队列实现 大小根堆 解决top k 问题

      摘于:http://my.oschina.net/leejun2005/blog/135085 目录:[ - ] 1.认识 PriorityQueue 2.应用:求 Top K 大/小 的元素 3 ...

  4. 【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

    本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...

  5. 随手练——HDU 1078 FatMouse and Cheese(记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意: 一张n*n的格子表格,每个格子里有个数,每次能够水平或竖直走k个格子,允许上下左右走,每次走的格子 ...

  6. 随手练——HDU 5015 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5015 看到这个限时,我就知道这题不简单~~矩阵快速幂,找递推关系 我们假设第一列为: 23 a1 a2 ...

  7. 随手练——HDU 1284 动态规划入门

    #include <iostream> #include <algorithm> #include <string.h> using namespace std; ...

  8. 随手练——HDU 1251 统计难题

    知识点:前缀树.典型的前缀树模板. 这是用next[26]数组的版本,超内存了.(后来发现,用C++交不会超,G++就会超) #include <iostream> #include &l ...

  9. 随手练——HDU 1237 表达式求值(输入格式典型)

    坑了老子半天,结果是 float 范围不够!!! 基本思想: 开一个符号栈,一个数字栈: 碰到数字就入栈,碰到符号就与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算 ...

随机推荐

  1. js 千分位符号 正则方法

    function toThousands(num) {    return (num || 0).toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');}

  2. Cookie,Sesstion,Application 缓存。

    Cookie客户端缓存. 1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要 ...

  3. Apache Rewrite的主要功能

    #Apache Rewrite的主要功能 #就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.#平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 在httpd.conf中去掉下 ...

  4. H5演示文稿快速制作

    详见: http://www.geekfan.net/8107/ 或 http://www.jianshu.com/p/09a3bbb8b362

  5. delphi之读写文件的三种方式

    一.Tstrings.Tstringlist procedure TForm1.Button2Click(Sender: TObject); var strlist: TStringList; pat ...

  6. sdoi 2017 r1游记

    第一次参加省选... 不过幸亏我参加过WC和THUWC,还是有些经验的. 经验就是:多拿部分分(不过话说我的部分分大部分都丢了). D1: 第一题没有预处理斐波那契数列的幂,算复杂度算错了...丢了4 ...

  7. js迪杰斯特拉算法求最短路径

    1.后台生成矩阵 名词解释和下图参考:https://blog.csdn.net/csdnxcn/article/details/80057574 double[,] arr = new double ...

  8. jquery操作select(选中,取值)

    最近工作中总出现select 和 option问题,整理一下,内容大部分源于网络资料 一.基础取值问题 例如<select class="selector"></ ...

  9. LeetCode赛题392---- Is Subsequence

    392. Is Subsequence Given a string s and a string t, check if s is subsequence of t. You may assume ...

  10. Python爬虫教程-10-UserAgent和常见浏览器UA值

    Python爬虫教程-10-UserAgent和常见浏览器UA值 有时候使用爬虫会被网站封了IP,所以需要去模拟浏览器,隐藏用户身份, UserAgent 包含浏览器信息,用户身份,设备系统信息 Us ...