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,考虑何时必须分 ...
随机推荐
- Django 的一些错误以及处理
django.template.exceptions.TemplateSyntaxError: Invalid block tag on line 589: 'static', expected 'e ...
- 渣渣菜鸡的 ElasticSearch 源码解析 —— 环境搭建
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/25/es-code01/ 软件环境 1.Intellij Idea:2018.2版本 2. ...
- MVC3 自定义的错误页
ASP.NET MVC3中如果配置文件出错了,怎么跳转到自定义的错误页,现在参考网上的档案是说 添加 如下配置文件,并且在路径Views/Shared/下添加Error页面,测试下没有用的,请大家看看 ...
- 关于报错“More than one fragment with the name [spring_web] was found. This is not legal ...”的解决办法
最近在搭建一个spring mvc 项目时遇到“More than one fragment with the name [spring_web] was found. This is not leg ...
- 关于原生javascript的this,this真是个强大的东东
最近一直坐在东钿微信服务平台,上上级领导提出一个要求,就是微信分享. 因为首页是一个tab切换页,领导想在分享的时候区分上产调还是评估.我研究了很久很久,一直都是失败,今天领导又问了.于是我就向我们老 ...
- js获取当前的年月日时分秒周期
function timeNow(){ var date = new Date(); this.year = date.getFullYear(); this.month = date.getMont ...
- C# 对接腾讯企业邮接口----get/post请求
在无所知之的情况下.来了一个对接接口的任务,没办法,只能根据前端时候的经验硬着头皮上了,随后又整理了一下写的方法,主要包括了部门的创建.更新.删除.查找.然后他们的前提是token的获取 首先HTTP ...
- python3发送邮件02(简单例子,带附件)
#!/usr/bin/env python# -*- coding:UTF-8 -*- import osimport smtplibfrom email.header import Headerfr ...
- LeetCode Pascal's Triangle Pascal三角形
题意:给一个数字,返回一个二维数组,包含一个三角形. 思路:n=0.1.2都是特例,特别处理.3行以上的的头尾都是1,其他都是依靠上一行的两个数.具体了解Pascal三角形原理. class Solu ...
- 如何处理错误消息Please install the gcc make perl packages
如何处理这行错误消息? Please install the gcc make perl packages from your distribution. 执行命令行:yum install gcc ...