随笔分类 - 数据结构——堆
摘要:题目链接:https://www.acwing.com/problem/content/description/151/ 给定长度为n的序列,代表一个单词的出现次数,要求构造k叉哈夫曼树使得总权值最小,并且在权值最小的情况下问最小的高度是多少? 我们可以考虑不断取k个数组成一个新的结点放入优先队列,
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/149/ 题目中给出一些点在x轴上的位置,问选出k对位置的情况下,他们的两两距离之和的最小值是多少?容易直到,选中的位置一定是相邻的而且没有交集,我们对原始序列求差分之后问题 就变成了在这个差分序列中寻找k个不相
阅读全文
摘要:题目链接:http://poj.org/problem?id=2442 给定一个M*N的矩阵,要求从每一行中都取出一个数然后累加,问最小的N个累积和为多少。使用堆可以在O(MNlogN)时间复杂度内求出。 M行的最大取法一定是通过前M-1行的最大取法+第M行取数然后求前N大获取的,所以有归纳法可以考
阅读全文
摘要:题目链接:http://poj.org/problem?id=1456 题意是给出一些商品的价值以及过期时间,现在每天只能卖出一个商品,问卖出商品的价值总和最多是多少,贪心算法可以解决,用一个集合表示决策 将商品按照过期时间进行排序之后顺序扫描,如果过期时间大于二叉堆中的商品数量就直接放入,若等于就
阅读全文
摘要:题目链接:http://poj.org/problem?id=3784 对顶堆算法:输入M个数的时候,将其中1~[M/2]个小的数存入大顶堆,将剩余数存入小顶堆,如果大顶堆中的数的数量大于[M/2]就讲堆顶元素取出扔到小顶堆中去, 当扫描到计数数量时,输出小顶堆的堆顶元素,也就是第[M/2]+1大的
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; typedef unsigned long long ull; #define pf printf #define
阅读全文