hdu 5884 Sort

题意:

n个有序序列的归并排序。每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和,总的合并代价不能超过T, 问k最小是多少。

解法:

1:首先想到的是二分这个答案k,然后check每个k是否可行

2:对于每个k,总共需要归并n-1个数,每次归并k-1个数

所以当(n-1)%(k-1)!=0的时候,会出现归并不能最大化个数的情况,这样会影响二分的单调性

我们先取(n-1)%(k-1)个小的数凑成一次k,接下来的数我们已经知道了肯定是(n-1)/(k-1)块了,所以可以直接想到放进优先队> 列,然后每次都拿前k个数,新的数继续丢进去

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue> using namespace std; #define LL long long
#define N 200100 LL a[N],T,n,t;
queue<int> q1, q2; inline bool check(int x) {
while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
for(int i = 1 ; i <= n ; i++)
q1.push(a[i]);
int num = 0;
LL sum = 0,ans = 0;
if((n - 1) % (x - 1) != 0) {
num = (n - 1) % (x - 1) + 1;
for(int i = 1 ; i <= num ; i++) {
sum += q1.front();
q1.pop();
}
q2.push(sum);
ans += sum;
}
while(!q1.empty()) {
sum = 0;
for(int i = 1 ; i <= x ; i++) {
if(!q1.empty() && !q2.empty()) {
if(q1.front() <= q2.front()) {
sum += q1.front();
q1.pop();
} else {
sum += q2.front();
q2.pop();
}
} else if(q1.empty()){
sum += q2.front();
q2.pop();
} else if(q2.empty()){
sum += q1.front();
q1.pop();
}
}
ans += sum;
q2.push(sum);
}
if(ans > T) return false;
sum = num = 0;
while(!q2.empty()) {
sum += q2.front();
q2.pop();
num++;
if(num == x) {
q2.push(sum);
ans += sum;
sum = num = 0;
if(q2.size() == 1) break;
}
}
if(ans > T) return false;
else return true;
} int main() {
scanf("%lld",&t);
while(t--) {
scanf("%lld%lld",&n,&T);
for(int i = 1 ; i <= n ; i++)
scanf("%lld",&a[i]);
sort(a + 1, a + n + 1);
LL l = 2, r = n, mid, ans = 0;
while(l <= r) {
mid = (l + r) >> 1;
if(check(mid)) {
ans = mid;
r = mid - 1;
} else l = mid + 1;
}
printf("%lld\n", ans);
}
//system("pause");
return 0;
}

最新文章

  1. HTML5-电影影评网
  2. WPF的路由事件、冒泡事件、隧道事件(预览事件)
  3. lucene写索引出现锁文件的原因之一
  4. GNOME on Arch Linux
  5. 学DIV+CSS技术,如何入门?(2)
  6. SQL Server如何删除多余tempDB文件
  7. hdu1875 畅通工程再续 最小生成树并查集解决---kruskal
  8. C#实例
  9. Sublime text2如何设置快捷键让编写的HTML文件在浏览器预览?
  10. DDOS的攻击原理和防护指南
  11. Xcode插件筛选
  12. Java基础知识强化25:Java创建对象的四种方式
  13. applicationContext.xml 配置文件的存放位置
  14. java 读取excel(Map结构)xls
  15. RecyclerView.ItemDecoration
  16. String 转化成java.sql.Date和java.sql.Time
  17. Selenium WebDriver的实现及工作原理
  18. springMVC 拦截器源码解析
  19. 黑客专用操作系统——Kali Linux简介
  20. 【Django】ModuleNotFoundError: No module named &#39;books_ordersschool&#39;

热门文章

  1. 《深入理解 Java 虚拟机》学习 -- 类加载机制
  2. java怎么解除文件占用(Dom4j操作完xml后怎么关流)
  3. 日志实时收集之FileBeat+Kafka
  4. windows连接远程服务器报错&#39;SSH&#39; 不是内部或外部命令,也不是可运行的程序 或批处理文件 解决方案
  5. docker 无法使用vi
  6. easyui的combobox默认选中第一个选项
  7. “最不合格”的SAP应聘者: 从大学生到SAP成都研究院开发工程师
  8. 每日命令:(7)mv
  9. 对于在tinyOS中读取MPU6050数据卡死的总结
  10. idou老师教你学Istio05: 如何用Isito实现智能路由配置