hdu 5884 Sort 队列+多叉哈夫曼树】的更多相关文章

Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Recently, Bob has just learnt a naive sorting algorithm: merge sort. Now, Bob receives a task from Alice.Alice will give Bob N sorted sequenc…
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下,这个代价其实就是 k 叉的哈夫曼树问题.然后用两个队列维护一下就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string>…
这题真心比较奥义,先见这个人的博客:http://blog.csdn.net/libin66/article/details/52565484 补0的方法是使得其满足成为满K叉树,而其博客中所说的“所以当(n-1)%(k-1)!=0的时候,会出现归并不能最大化个数的情况,这样会影响二分的单调性”我作如下的解释: 至于为什么不加0,sum会变大呢?作如下的解释:因为有一次合并不是最大个数的话,与其让它在后面单独合并增加权值还不如在前面补0合并呢,毕竟我们在算k的时候sum越小越好嘛~ 原先代码如下…
// 两个队列+k叉哈夫曼树 HDU 5884 // camp题解: // 题意:nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过TT, 问kk最小是多少. // . // 题解:首先二分一下这个kk.然后在给定kk的情况下,这个代价其实就是kk叉的哈夫曼树问题.因此直接套用哈夫曼树的堆做法即可.复杂度O(nlog^2n) // ​,这样优化一下读入是可以卡过去的. // 然后主代码手表示,利用合并的单调性,可以去掉优先队列得到O(…
题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给定的情况下,构造k叉哈夫曼树.O(nlogn)的做法:先对所有数排序,另外一个队列维护合并后的值,取值时从两个序列前端取小的即可. 注:如果(n-1)%(k-1)!=0,那么就要增加(k-1-(n-1)%(k-1))个权值为0的叶子节点作虚拟点. #include<cstdio> #include…
HDU5884 Sort 题意:有n个序列要进行归并,每次归并的代价是两个序列的长度的和,要求最终的代价不能超过规定的T,求在此前提下一次能同时进行归并的序列的个数k. 思路:还是太单纯,看完题目一直以为要用归并排序来解题,如果已经看过多叉哈夫曼树的知识的话估计就不会这样了.先二分查找这个k,然后用多叉哈夫曼树来判断这个k是不是还能再变小.用两个队列来实现多叉哈夫曼树. PS:如果不进行提前处理的话,最后一次的归并可能就凑不齐k个来了,所以需要提前处理一下. 代码: #include <iost…
追逐影子的人,自己就是影子. ——荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和<伊利亚特>组成的鸿篇巨制<荷马史诗>实在是太长了,达达想通过一种编码方式使得它变得短一些. 一部<荷马史诗>中有 n 种不同的单词,从 1 到 n 进行编号.其中第 i 种单词出现的总次数为 wiwi. 达达想要用 k 进制串 sisi 来替换第 i 种单词,使得其满足如下要求:…
题目大意:给定一个大小为 N 的集合,每次可以从中挑出 2 个或 3 个数进行合并,合并的代价是几个数的权值和,求将这些数合并成 1 个的最小代价是多少. 引理:K 叉哈夫曼树需要保证 \((n-1)\%(k-1)=0\),在此基础上,每次取 K 个合并即可得到最小代价. 代码如下 #include <bits/stdc++.h> using namespace std; inline int read(){ int x=0,f=1;char ch; do{ch=getchar();if(ch…
[NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #include< cstdio > #include< algorithm > typedef unsigned long long ull; template inline void read(T&x) { x=0;bool f=0;char c=getchar(); while…
hdu5884 题意 给出 n 个数,每次选择不超过 k 个数合并(删掉这些数,加入这些数的和),花费为合并的这些数的和,要求最后只剩下一个数,问 k 最小取多少. 分析 二分 k,合并数的时候可以按照哈夫曼树构树的原理来进行合并.因为新形成的数存在递增的单调性,所以可以开一个数组(队列)存储新生成的数,将原来的数组排序,通过取两个数组最小的 k 个数,将和放置到队尾,直到只剩下一个数. 如果 \((n-1)\%(k-1)\neq0\),说明不能正好合并得到一个数,此时要先选择\((n-1)\%…