Sort HDU5884(二分+多叉哈夫曼树)
题意:有n个序列要进行归并,每次归并的代价是两个序列的长度的和,要求最终的代价不能超过规定的T,求在此前提下一次能同时进行归并的序列的个数k。
思路:还是太单纯,看完题目一直以为要用归并排序来解题,如果已经看过多叉哈夫曼树的知识的话估计就不会这样了。先二分查找这个k,然后用多叉哈夫曼树来判断这个k是不是还能再变小。用两个队列来实现多叉哈夫曼树。
PS:如果不进行提前处理的话,最后一次的归并可能就凑不齐k个来了,所以需要提前处理一下。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
const int maxn = 1e5 + ;
typedef long long ll;
//typedef pair<int,int> P;
queue<ll> q1;
queue<ll> q2;
int T,n;
ll a[maxn];
ll t; bool Hufman(int x)
{
while (!q1.empty()) q1.pop();
while (!q2.empty()) q2.pop();
int tt = (n - ) % (x - ); if (tt)
{
for (int i = ; i <= x - - tt; i++)//添加虚构0,使得最后一次能凑齐k个序列,手动模拟了一下求tt的过程,
q1.push();//但不明白n-1具体的原因,不知是不是固定的模式
}
for (int i = ; i <= n; i++)
q1.push(a[i]);
ll sum = ;
while ()
{
ll tem = ;
for (int i = ; i <= x; i++)
{
if (q1.empty() && q2.empty())break;
if (q1.empty())
{
tem += q2.front();
q2.pop();
}
else if (q2.empty())
{
tem += q1.front();
q1.pop();
}
else
{
int tx, ty;
tx = q1.front();
ty = q2.front();
if (tx < ty)
{
tem += tx;
q1.pop();
}
else
{
tem += ty;
q2.pop();
}
}
}
sum += tem;
if (q1.empty() && q2.empty())break;
q2.push(tem);//q2这个序列一定是有序的
}
if (sum <= t)
return ;
else
return ;
} int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%lld", &n, &t);
for (int i = ; i <= n; i++)
scanf("%lld", &a[i]);
sort(a + , a + + n); int st = , en = n; while (st < en)
{
int mid = (st + en) / ;
if (Hufman(mid))
en = mid;
else
st = mid + ;
//printf("GG\n");
}
printf("%d\n", st);
}
return ;
}
Sort HDU5884(二分+多叉哈夫曼树)的更多相关文章
- hdu5884 Sort(二分+k叉哈夫曼树)
题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...
- HDU 5884 Sort (二分+k叉哈夫曼树)
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...
- hdu5884(多叉哈夫曼树)
hdu5884 题意 给出 n 个数,每次选择不超过 k 个数合并(删掉这些数,加入这些数的和),花费为合并的这些数的和,要求最后只剩下一个数,问 k 最小取多少. 分析 二分 k,合并数的时候可以按 ...
- 两个队列+k叉哈夫曼树 HDU 5884
// 两个队列+k叉哈夫曼树 HDU 5884 // camp题解: // 题意:nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过TT, ...
- 【CF884D】Boxes And Balls k叉哈夫曼树
题目大意:给定一个大小为 N 的集合,每次可以从中挑出 2 个或 3 个数进行合并,合并的代价是几个数的权值和,求将这些数合并成 1 个的最小代价是多少. 引理:K 叉哈夫曼树需要保证 \((n-1) ...
- UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树
[NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #in ...
- AcWing:149. 荷马史诗(哈夫曼编码 + 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 ...
随机推荐
- Java 定时任务之Quartz
使用CronTrigger CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式,CronTrigger 支持日历相关的重复时间间 ...
- keepalived+nginx安装配置
软件版本号: pcre8.36 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz keepalived1.2 ...
- node npm Bower
Download | Node.js https://nodejs.org/en/download/ wget https://nodejs.org/dist/v8.11.3/node-v8.11.3 ...
- STM32:TIMER输出比较模式-PWM
在自己小板子上移植PWM时候又重新学习了一下,加入两点:1,对各种输出比较模式的学习:2,输出模式时加入中断 先写出函数: //TIM4 PWM部分初始化 //PWM输出初始化 //period:输出 ...
- SEL是啥玩意
一.了解SEL前的准备-----isa指针简述 1.一个类就像一个 C 结构,NSObject 声明了一个成员变量: isa.由于 NSObject 是所有类的根类,所以所有的对象都会有一个 isa ...
- 51. ExtJs4之Ext.util.JSON编码和解码JSON对象
转自:https://blog.csdn.net/iteye_9439/article/details/82518158 1.decode() 该方法用于将符合JSON格式的String进行解码成为一 ...
- 浅谈IO优化
三层结构 磁盘(存储).VM(卷管理)和文件系统.专有名词不好理解,打个比方说:磁盘就相当于一块待用的空地:LVM相当于空地上的围墙(把空地划分成多个部分):文件系统则相当于每块空地上建的楼房(决定了 ...
- css bug(ie6兼容问题)
二.五大浏览器内核1.trident(MSHTML)(三叉戟:三叉线,三齿鱼叉) Gecko (壁虎) presto(迅速的) webkit(safari内核,Chrome内核原型,他是苹果公司自己的 ...
- php字符串读取函数
function cc_msubstr($str, $length, $start=0, $charset="utf-8", $suffix=true){ if(function_ ...
- Netty(1) - 理解
官网:netty.io ---------------------------------------------------------------------------------------- ...