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,考虑何时必须分 ...
随机推荐
- sql-monitore 的bug 。
http://www.mamicode.com/info-detail-1659243.html 存储过程无法做 sql -monitor , 而存储过程跑的sql (只能通过awr 报告来看sql_ ...
- sql server replace函数巧妙完成字符串联结
示例一: 需求:将'1,2,3,4,5,6,7,8,9,10'转成:'1','2','3','4','5','6','7','8','9','10' ),) set @s='1,2,3,4,5,6,7 ...
- 低版本Firefox支持innerText属性兼容方法
FireFox支持innerText属性了,很遗憾是44.0.2版本以下还需要兼容处理. 方法一: innerHTML是符合W3C标准的属性,而innerText只适用于IE浏览器,因此,尽可能地去使 ...
- Ionic开发-常用插件安装
cordova plugin add cordova-plugin-nativestoragecordova plugin add cordova-plugin-devicecordova plu ...
- 用户 'IIS APPPOOL\**' 登录失败的解决方案(项目部署到本地IIS上打开网页出现报错)
为开发方便-将项目部署到本地IIS上打开网页出现报错 1.打开IIS管理 2.点击应用池 3.找到你部署的网站名,右键“高级设置”——>“进程模型”——>“标识”修改为localsyste ...
- .net创建activex实现摄像头拍照
using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices ...
- 关于ECSHOP中sql注入漏洞修复
标签:ecshop sql注入漏洞修复 公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程 ...
- 桉树IAAS云架构(转载)
您可在 IaaS 云中建立和管理混合多虚拟机集群环境,并将现有 vSphere™. ESX™.ESXi™.KVM 和 XEN 虚拟环境作为 AWS 兼容 Eucalyptus桉树混合云管理.现在 Eu ...
- 系统有问题基本出在数据库上,web层无状态
系统有问题基本出在数据库上,web层无状态.
- python3操作excel02(对excel的基础操作,进行简单的封装)3
#!/usr/bin/env python# -*- coding:UTF-8 -*- import requestsfrom bs4 import BeautifulSoupfrom bs4 imp ...