数据结构:优先队列
文章平均质量分 90
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
UVa 11997 K Smallest Sums 优先队列&&打有序表&&归并
You’re given k arrays, each array has k integers. There are k k ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums among them.原创 2016-03-05 13:58:16 · 1750 阅读 · 1 评论 -
UESTC 1595 老司机的毒奶 贪心+二叉树+优先队列
题意:给出n个不同的数,每个数可以最多进行ki次操作,每次操作 ai/2。每次操作后n个数必须互不相等。 求max{ai}(1<=i<=n)的最小值。 贪心+二叉树+优先队列 ai的k次ai/2的操作,刚好像是在二叉树上走,也就是这n个数可以丢到一个二叉树里,每次把编号最大的节点, 往根的方向走,需找一个没有被标记过的节点,找到最近的一个可行节点则本次操作成功,继续处理新的最大值。 故把所有暂时存在的数用map<int, bool> mp标记,且把所有的数丢到优先队列里, 每次取出最大的,判断是否存在k,原创 2017-05-16 19:33:35 · 927 阅读 · 0 评论 -
UESTC 1593 老司机破阵 优先队列+双端链表
优先队列+双端链表 cf原题,直接贴的以前的代码 反向做,按着反的顺序把元素一个一个的添加进去,用priority_queue 维护当前最值, 用双向链表维护当前区间的状态,L[i]表示以i为端点的区间的区间左端点, R[i]表示以i为区间端点的右端点。 对于每个点 j, 当只R[i + 1] != 0 时, 右边有区间,可以把两个链表合并成一个, R[i] = R[i + 1], L[i] = i; 当只L[i - 1] != 0 时, 左边有区间,可以把两个链表合并成一个, R[L[i - 1]]原创 2017-05-16 19:24:13 · 953 阅读 · 0 评论 -
UESTC 1599 wtmsb 优先队列(最小值优先)
题意:有n个数,每次可以选择2个数x和y进行合并,其代价和结果都是x+y,要求n-1次合并的最小代价。 优先队列(最小值优先) 把所有的数丢进优先队列, 然后每次如果队列里的元素个数>= 2, 则取出2个数合并记录然后把和丢回队列, 直到元素个数为1. 复杂度 O(nlogn)原创 2017-05-16 19:19:10 · 1246 阅读 · 0 评论 -
Codeforces Round #402 (Div. 2) D. String Game 二分+优先队列+字符串匹配
题意:给出文本串和目标串,然后给出一个文本串删除字符的序列,从a1~an,要求删除s[a1 ~ ak]时剩下的字符串依然可以匹配,求尽可能大的k。 二分+优先队列+字符串匹配 从左往右是删除字符的顺序,倒着做,从右往做是添加字符的顺序,故check mid~n这个序列能否满足目标串的匹配,要求mid尽可能小, 故二分这个剩余序列长度即可,每次check是用优先队列priority_queue<int, vector<int>, greater<int>> pq;,然后依次进行匹配。 复杂度 O(nlognl原创 2017-02-26 21:41:34 · 1052 阅读 · 0 评论 -
Codeforces Round #378 (Div. 2) D. Kostya the Sculptor __ data structures、map<ii, priority_queue<ii>>
题意:可以把2个长方体合并成1个(只能把尺寸相同的面合并),或者只选一个,然后搞出一个球,求选1个或者2个合并成1个,从而球的体积最大 data structures、map<ii, priority_queue<ii> > mp; 把长方体的分成地面和高来储存, 如果长宽高3条边都不相等,则每个面存一次,mp[ii(x, y)].push(ii(z, i)); mp[ii(y, z)].push(ii(x, i)); mp[ii(x, z)].push(ii(y, i)); 并且确保mp.first原创 2016-11-14 00:36:35 · 883 阅读 · 0 评论 -
Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets __ dfs+优先队列+贪心
dfs+优先队列+贪心 向把数读入到priority_queue, 同时用 map<int, bool> mp来标记这些数字,出现过。 然后每次贪心的取最大的值,u = pq.top(), mp[u] = false; 然后dfs的向下推可行的一步,比如 13 到 6 如果可以就标记并返回,否者继续向下找。 如果最大值已经不能向下推了,则pq里维护着的元素就是答案了。 此外,这个方法对于 n == 1时要特殊处理, 不然n == 1的时候 一直mp[1] = false,然后dfs(1),这样每次flag都原创 2016-10-03 22:11:22 · 817 阅读 · 0 评论 -
Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 双向链表+反向做+优先队列
双向链表+反向做+优先队列 反向做,按着反的顺序把元素一个一个的添加进去,用priority_queue 维护当前最值, 用双向链表维护当前区间的状态,L[i]表示以i为端点的区间的区间左端点,R[i]表示以i为区间端点的右端点 对于每个点 j, 当只R[i + 1] != 0 时, 右边有区间,可以把两个链表合并成一个, R[i] = R[i + 1], L[i] = i; 当只L[i - 1] != 0 时, 左边有区间,可以把两个链表合并成一个原创 2016-10-03 21:55:21 · 1037 阅读 · 0 评论 -
2016 UESTC Training for Data Structures D - 卿学姐与魔法 优先队列、构造
用STL里的优先队列直接维护前n+1小的数字 ptr = 0 先 i = ptr 然后A + B1 + B2 + …… B(n-1) 然后 j = 1 B1 + A2 + ……A(n-1) 这样依次下去, 当 Aptr + B(ptr+1) 已经比.top()大了,则可以break了。 故最好的情况O(n), 最差的情况(┬_┬)不会算但绝对小于O(n^2) 竟然用了do while 开心原创 2016-05-01 00:02:14 · 1353 阅读 · 0 评论 -
2016 UESTC Training for Data Structures J - 郭大侠与Rabi-Ribi 优先队列
用STL里的优先队列, 倒过来做处理兔子出现的时间,总时间为maxT 那样出现就丢到优先队列里去,从这个时刻起就一直都存在了 没个时刻拿一只最大的出来 pq.top()打晕就好了原创 2016-05-01 00:02:54 · 1868 阅读 · 2 评论 -
Codeforces Hello 2018 C. Party Lemonade 贪心、优先队列
题意:有n种饮料,每种的一份 2^(i-1)升花费ci 卢布,要求总共买L升,花最少的钱,求出最小的花费。 贪心、优先队列、乱搞 首先把饮料的单价(ci / 2^(i-1))和标号(i)丢如小根堆, 然后维护ans = 0 为已购买的饮料的最小花费, resL = L 表示剩余需要购买的饮料, precost = 9e18表示剩下的直接买一份(买的那份可能比resL多)时的最小花费。 每次取出堆顶,此时的饮料是最廉价的, 如果每份的容量大于剩余的,则刷新precost,此时如果 ans被刷新过,则 prec原创 2018-01-13 17:13:14 · 744 阅读 · 0 评论