两个队列+k叉哈夫曼树 HDU 5884
// 两个队列+k叉哈夫曼树 HDU 5884
// camp题解:
// 题意:nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过TT, 问kk最小是多少。
// .
// 题解:首先二分一下这个kk。然后在给定kk的情况下,这个代价其实就是kk叉的哈夫曼树问题。因此直接套用哈夫曼树的堆做法即可。复杂度O(nlog^2n)
// ,这样优化一下读入是可以卡过去的。
// 然后主代码手表示,利用合并的单调性,可以去掉优先队列得到O(nlogn)的做法:先对所有数排序,另外一个队列维护合并后的值,取值时从两个序列前端取小的即可。
// 昂:如果(n-1)%(k-1)≠0,要把最小的(n-1)%(k-1)+1个数先合并一下。 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
using namespace std;
#define LL long long
typedef pair<int,int> pii;
const int inf = 0x3f3f3f3f;
const int MOD = ;
const int N = 1e5+;
const int maxx = ;
#define clc(a,b) memset(a,b,sizeof(a))
const double eps = 1e-;
void fre() {freopen("in.txt","r",stdin);}
void freout() {freopen("out.txt","w",stdout);}
inline int read() {int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-; ch=getchar();}while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}return x*f;} int a[N];
int n,m;
bool check(int k){
queue<LL>q1;
queue<LL>q2;
if((n-)%(k-)!=){
for(int i=;i<=k--(n-)%(k-);i++)
q1.push();
}
for(int i=;i<=n;i++){
q1.push(a[i]);
}
LL sum=;
while(){
LL tem=;
for(int i=;i<=k;i++){
if(q1.size()==&&q2.size()==) break;
int a1,a2;
if(q1.size()==){
tem+=q2.front();
q2.pop();
continue;
}
if(q2.size()==) {
tem+=q1.front();
q1.pop();
continue;
}
a1=q1.front();
a2=q2.front();
if(a1<a2) {tem+=a1;q1.pop();}
else {tem+=a2;q2.pop();}
}
sum+=tem;
if(q1.size()==&&q2.size()==) break;
q2.push(tem);
}
if(sum>m) return false;
else return true;
} int main(){
// fre();
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a++n);
int l=,r=n;
while(l<r){
int mid=(l+r)>>;
if(check(mid)) r=mid;
else l=mid+;
}
printf("%d\n",r);
}
return ;
}
两个队列+k叉哈夫曼树 HDU 5884的更多相关文章
- hdu5884 Sort(二分+k叉哈夫曼树)
题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...
- AcWing:149. 荷马史诗(哈夫曼编码 + k叉哈夫曼树)
追逐影子的人,自己就是影子. ——荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和<伊 ...
- 【CF884D】Boxes And Balls k叉哈夫曼树
题目大意:给定一个大小为 N 的集合,每次可以从中挑出 2 个或 3 个数进行合并,合并的代价是几个数的权值和,求将这些数合并成 1 个的最小代价是多少. 引理:K 叉哈夫曼树需要保证 \((n-1) ...
- UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树
[NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #in ...
- HDU 5884 Sort (二分+k叉哈夫曼树)
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...
- hdu 5884 Sort 队列+多叉哈夫曼树
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Des ...
- bzoj 4198 [ Noi 2015 ] 荷马史诗 —— 哈夫曼编码(k叉哈夫曼树)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 第一次写哈夫曼树!看了很多博客. 哈夫曼树 & 哈夫曼编码:https://w ...
- P2168 [NOI2015]荷马史诗 k叉哈夫曼树
思路:哈夫曼编码 提交:1次(参考题解) 题解:类似合并果子$QwQ$ 取出前$k$小(注意如果叶子结点不满的话要补全),合并起来再扔回堆里去. #include<cstdio> #inc ...
- BZOJ 4198: [Noi2015]荷马史诗 哈夫曼树 k叉哈夫曼树
https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://blog.csdn.net/chn_jz/article/details/7 ...
随机推荐
- 在windows上配置jdk环境
下载和安装的java jdk的步骤此处就忽略了.就从配置jdk配置开始说起: 安装完JDK后配置环境变量 计算机→属性→高级系统设置→高级→环境变量 系统变量→新建 JAVA_HOME 变量 . 变 ...
- C#题型补充
让用户输入一个奇数,打印菱形,最长的行内容个数为用户输入的个数,并且由英文字母拼接而成 Console.Write("请输入一个数字:"); try { int a = Conve ...
- Maven —— 如何设置HTTP代理
公司需要设置代理才能上网,而运行Maven时需要下载依赖的库. 怎么办呢? 原来Maven也像IE一样,可以设置代理的. 步骤如下: ·编辑 ~/.m2/setting.xml 文件.如果该目录下没有 ...
- Mac 切换Windows 使用虚拟机, 不推荐双系统
为什么使用虚拟机而不是双系统? 1.虚拟机可以随时在两个系统之间进行切换,便于在工作时使用而不影响效率.如果是双系统,在切换到另一个系统时需要关机重启,太过麻烦. 2.虚拟机除了运行Windows之 ...
- Tuple元祖
http://www.codeproject.com/Articles/193537/C-4-Tuples
- shell查找匹配行,输出该行并输出下面的一行
查找匹配行,输出该行并输出下面的一行 grep: grep -A 1 'keyword' file awk:awk '$0~/keyword/{print $0; getline; print $ ...
- mysql中的去除空格函数
(1)mysql replace 函数 语法:replace(object,search,replace) 意思:把object中出现search的全部替换为replace 案例:update `ne ...
- arranging-coins
https://leetcode.com/problems/arranging-coins/ public class Solution { public int arrangeCoins(int n ...
- Android实现自定义字体
介绍 最近在看开源项目的时候,发现里面涉及到了自定义字体,虽然自己目前还用不到,但是动手demo笔记记录一下还是有必要的,没准哪天需要到这个功能. 原理 1.其实实现起来非常简单,主要是用到了Type ...
- Linux diff patch
/***************************************************************************** * Linux diff patch * ...