HDU - 5884 Sort (二分答案+贪心)
有n个数字,你需要把这n个数字合成一个数字,每次只能把k个数字合并成一个,花费为这k个数字的和。
给一个最大花费,问不超过这个最大花费的情况下,k的最小值。
Sample Input
1
5 25
1 2 3 4 5 Sample Output
3
这个题很容易想到二分答案+优先队列check
然而这样复杂度是 O(n logn*logn ),会TLE(这特么都会TLE?加个读入优化就过了)
可以先给所有数字排个序,然后用两个队列,一个存原来的数字,一个存新合成的数字。
所以两个队列都是有序的。每次取的时候比较那个队列的第一个数小,就从哪一个里面取。这样复杂度是O(nlogn)的。
然后有一个坑点。你是要把n个数合并成一个,那么说你要减少n-1个数。每次只能减少 k-1 个数。
那么当 (n-1) % (k-1) != 0 时,就一定不能正好最优合并,所以要添加 k-1 - (n-1)%(k-1) 个0,来补齐。
开long long。否则就WA。很真实。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream> using namespace std;
typedef long long LL;
const int maxn = +; int T;
int a[maxn];
int n, p; bool check(int mid)
{
LL cost = ;
queue<LL> q1, q2; int t = (n-) % (mid-);
if (t != )
for (int i = ; i <= mid--t; i++) q1.push(); for (int i = ; i <= n; i++) q1.push(a[i]); while(q1.size() + q2.size() > )
{
LL pp = ;
for (int i = ; i <= mid; i++)
{
if (!q1.empty() && !q2.empty())
{
if (q1.front() < q2.front()) pp += q1.front(), q1.pop();
else pp += q2.front(), q2.pop();
}
else if (!q1.empty()) pp+= q1.front(), q1.pop();
else if (!q2.empty()) pp+= q2.front(), q2.pop();
else break;
}
cost += pp;
q2.push(pp);
}
return cost <= p;
} int main()
{
int T;
scanf("%d", &T);
for (int t = ; t <= T; t++)
{
scanf("%d%d", &n, &p);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
sort(a+, a++n); int l = , r = n, ans;
while(l <= r)
{
int mid = (l+r)/;
if (check(mid)) ans = mid, r = mid-;
else l = mid+;
}
printf("%d\n", ans);
} return ;
}
HDU - 5884 Sort (二分答案+贪心)的更多相关文章
- HDU 5884 Sort (二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ...
- HDU 5884 Sort (二分+k叉哈夫曼树)
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...
- BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心
BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心 Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C ...
- 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心
题目链接 题意 给你一个N*M的矩阵 (N,M <=2000) 把他分成两部分 使两部分的极差较大的一个最小 求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...
- HDU 5884 Sort(二分答案+计算WPL的技巧)
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Sort HDU - 5884(优先队列+二分)
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 【洛谷】【二分答案+贪心】P1316 丢瓶盖
[题目描述:] 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? [ ...
- Gym 100886J Sockets 二分答案 + 贪心
Description standard input/outputStatements Valera has only one electrical socket in his flat. He al ...
- bzoj 4310 跳蚤 —— 后缀数组+二分答案+贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分 ...
随机推荐
- shell 发送Post请求,并获取状态码
#!/bin/bash aa=$ result=$(curl -H "Content-type: application/json" -X POST -o /dev/null -s ...
- Mybatis 查询一个对象包含多个子对象 (List 包含 List)
功能:查询一个数据列表 且每个数据中包含各自的子数据集合 使用场景:1. 当需要查询多订单数据且同时订单数据中需要包含订单明细数据时 2. 当需要查询多评论数据且同时评论数据中需要包含评论回复数据时 ...
- SpringCloud多模块整理
1.项目架构 —— project 父项目 —— client 子项目(客户端) 对外暴露的接口 —————— pom.xml 子项目的pom文件 ...
- 译:Java 中的正则表达式性能概述
原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...
- WebStorm技巧-集成命令行工具插件
打开菜单项 File -> Settings- 搜索插件 CMD Support,并安装. 重启WebStorm,在你的项目中新建一个Cmd script 文件,命名为build.cmd ...
- sqlserver 删除两种方法比较
delete from tb where id=1 删除数据 truncate table tb where id=1 第一种 自增长id不会删除,第二种会删除
- JAVA基础之基本类型包装类、System类、Math类、Arrays类及大数据运算
个人理解: 为了方便运算及调用一些方法,我们需要将基本类型的数值转换为对象:不过转换的时候需要特别注意好它们的类型到底是什么,需要调用方法的类名是哪个!特别注意是Byte常量池的相关问题(==):gc ...
- AngularJS(六):表单-复选框
本文也同步发表在我的公众号“我的天空” 复选框 复选框只有两个值:true或者false,因此在AngularJS中,一般都是将复选框的ng-model绑定为一个布尔值属性,通过这两个布尔值来决定其勾 ...
- AngularJS(四):控制器、事件
本文也同步发表在我的公众号“我的天空” 控制器 控制器可以说是AngularJS中最重要的部分了!之前的一些示例,除了第一讲的示例以外,我们对于AngularJS的使用都集中在HTML部分,其实Ang ...
- NullPointerException检测
APET-NPE插件工作原理 android应用程序编译的过程如下: 从图中,我们可以看出,app编译大致经历了四大阶段:java source files -> .class files -& ...