HDU 5884 Sort (二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884
nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过TT, 问kk最小是多少
用一个队列维护合并的数,二分一下判断合理性。注意一点的是要是(n - 1)%(k - 1) != 0的话,就要先合并前(n - 1)%(k - 1) + 1项,这样会更优一点。还有细节问题很多要注意。
//#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
#include <queue>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = 1e5 + ;
LL a[N], m;
int n; bool judge(int k) {
queue <int> que;
while(!que.empty()) {
que.pop();
}
int sum = , i = ;
if((n - )%(k - )) {
for( ; i <= (n - ) % (k - ) + ; ++i) {
sum += a[i];
}
que.push(sum);
}
int ans = sum;
for(; i <= n || !que.empty(); ++i) {
if(que.size() <= && i > n)
break;
int cnt = k, ok = ;
sum = ;
while(cnt--) {
if((que.size() && que.front() < a[i])|| i > n) {
sum += que.front();
que.pop();
} else {
ok = ;
sum += a[i++];
}
}
if(ok) {
--i;
}
ans += sum;
que.push(sum);
}
return ans <= m;
} int main()
{
int t;
scanf("%d", &t);
while(t--) {
scanf("%d %lld", &n, &m);
for(int i = ; i <= n; ++i) {
scanf("%lld", a + i);
}
sort(a + , a + n + );
int l = , r = n;
while(l < r) {
int mid = (l + r) / ;
if(judge(mid)) {
r = mid;
} else {
l = mid + ;
}
}
printf("%d\n", r);
}
return ;
}
HDU 5884 Sort (二分)的更多相关文章
- HDU 5884 Sort (二分+k叉哈夫曼树)
		
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...
 - HDU 5884 Sort(二分答案+计算WPL的技巧)
		
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
 - HDU 5884 Sort(二分+优先队列)
		
http://acm.hdu.edu.cn/showproblem.php?pid=5884 题意:有个屌丝设计了一个程序,每次可以将k个数组进行合并,代价为这k个数组总的长度之和.现在另外一个屌丝要 ...
 - Sort HDU - 5884(优先队列+二分)
		
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
 - HDU 5884 Sort(2016年青岛网络赛 G 二分+贪心+小优化)
		
好题 题意:给你n<=100000个数,每个数范围[0,1000],然后给你一个最大的代价T,每次最多合并k个数成为一个数,代价为k个数的总和.问最后合成1个数的总代价不大于T的最小k 题解:我 ...
 - HDU - 5884 Sort (二分答案+贪心)
		
有n个数字,你需要把这n个数字合成一个数字,每次只能把k个数字合并成一个,花费为这k个数字的和. 给一个最大花费,问不超过这个最大花费的情况下,k的最小值. Sample Input 1 5 25 1 ...
 - 【最优K叉树】hdu 5884 Sort
		
http://acm.hdu.edu.cn/showproblem.php?pid=5884 参考:https://www.cnblogs.com/jhz033/p/5879452.html [题意] ...
 - HDU 5884 Sort
		
二分,验证. 二分$k$,然后进行验证.有一个地方需要注意一下:如果$n$个数,每次合并$k$个,最后一次不能合$k$个,那么一开始需要补$0$之后再合并才是最优的.合并的时候用优先队列合并时间复杂度 ...
 - HDU 5884 Sort  ——(K叉哈夫曼树)
		
这题真心比较奥义,先见这个人的博客:http://blog.csdn.net/libin66/article/details/52565484 补0的方法是使得其满足成为满K叉树,而其博客中所说的“所 ...
 
随机推荐
- [转] 判断html页是否滚动停止
			
原文链接:http://www.phpernote.com/javascript-function/754.html 最近有个项目中遇到这样一个问题: 有一个用于展示数据的带滚动条的DIV块,业务需求 ...
 - 8个必备的PHP功能开发 (转)
			
做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握. 1.传 ...
 - 用 Xcode 开发 Cydia Substrate 插件(二)
			
上次介绍了一个如何用 Xcode 来构建 Substrate 插件,但是开发的具体过程还没有涉及,而这往往又正是初学者最难下手的地方,所以有了本文的后续. 不过在开始之前你要先做好思想准备,相比较开发 ...
 - (六)6.13 Neurons Networks Implements of stack autoencoder
			
对于加深网络层数带来的问题,(gradient diffuse 局部最优等)可以使用逐层预训练(pre-training)的方法来避免 Stack-Autoencoder是一种逐层贪婪(Greedy ...
 - AIX 第6章 指令记录
			
AIX 存储管理 物理卷的概念和管理 卷组的概念和管理 逻辑卷的基本概念和管理 文件系统在逻辑卷上构建 日志文件系统的管理 镜像提高数据可用性 应用系统所需的存储切换 换页空间的功能和管理 在 ...
 - taobao
			
taobao */--> UP | HOME taobao Table of Contents 1 taobao 1 taobao 欣然小铺 Date: 2013-09-25 Wen Autho ...
 - Struts2实现Preparable接口和【struts2】继承ActionSupport类
			
Struts2实现Preparable接口 实现preparable接口,实现public void prepare() throws Exception 方法.当你访问某问action指定方法之前, ...
 - 输出流 写文件 文本 换行nextLine
			
FileOutputStream fos = new FileOutputStream( "c:\\test.txt "); String nextLin ...
 - POJ 2241  Mondriaan's Dream
			
题意:给一块n×m的空地,用1×2的砖铺,有多少种方案. 解法:状压dp.考虑dp[i][j]表示前i - 1行都铺满时第i行的状态为j时的方案数.对于第i行,每个格子上是否有砖用0和1表示,0表示不 ...
 - Delphi  关闭MDI子窗口
			
需要在子窗口的onClose事件中吧Action = caFree; 就可以了. procedure Tfrm_aa.FormClose(Sender: TObject; var Action: TC ...