有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 (二分答案+贪心)的更多相关文章

  1. HDU 5884 Sort (二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ...

  2. HDU 5884 Sort (二分+k叉哈夫曼树)

    题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...

  3. BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心

    BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心 Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C ...

  4. 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心

    题目链接 题意 给你一个N*M的矩阵 (N,M <=2000)  把他分成两部分 使两部分的极差较大的一个最小  求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...

  5. HDU 5884 Sort(二分答案+计算WPL的技巧)

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. Sort HDU - 5884(优先队列+二分)

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. 【洛谷】【二分答案+贪心】P1316 丢瓶盖

    [题目描述:] 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? [ ...

  8. Gym 100886J Sockets 二分答案 + 贪心

    Description standard input/outputStatements Valera has only one electrical socket in his flat. He al ...

  9. bzoj 4310 跳蚤 —— 后缀数组+二分答案+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分 ...

随机推荐

  1. 项目协作管理平台-teambition和tapd--深度体验

    ​ 一.分析目的 通过分析2B产品中的团队协作管理软件的对比分析,用于为公司团队协作软件的选型做产考. 二.竞品归属市场概况 2.1.目标用户群及需求 主要面向企业用户,用于解决企业不同地域以及不同职 ...

  2. 关于Identityserver4和IdentityServer3 授权不兼容的问题

    使用IdentityServer3 作为授权服务器,如果没有设置证书,而且client又没有设置AccessTokenType = AccessTokenType.Reference,则获取token ...

  3. webpack.config.js====webpack-dev-server开发服务器配置

    1. 安装webpack-dev-server(在指定目录下),一定要先安装完毕webpack webpack-cli之后在安装webpack-dev-server 一个基于expressjs的开发服 ...

  4. Android的bitmap和优化

    内存管理是个永恒的话题! 内存溢出:就是分配的内存不足以放下数据项序列.如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行.就是你要求分配的内存超出了系统 ...

  5. CoordinatorLayout使用笔记

    CoordinatorLayout的使用笔记 首先第一个子控件是AppBarLayout存放首部控件,里面放了一个CollapsingToolbarLayout.代码如下: <android.s ...

  6. Python3+Selenium3+webdriver学习笔记7(选择多链接的结果、iframe、下拉框)

    #!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriverfrom selenium.webdriver.co ...

  7. Monitorix系统和网络监控工具

    Monitorix 系统和网络监控公工具一.monitorixMonitorix是一款功能非常强大的免费开源轻型工具,目的在于监测Linux中的系统和网络资源.它可以定期收集系统和网络数据,并使用自己 ...

  8. C#去掉字符串最后面的一个标点符号的写法

    keywordHtml = keywordHtml.Remove(keywordHtml.LastIndexOf(','),1);

  9. Acronis.Disk.Director磁盘分区管理

    Acronis.Disk.Director分为for 专业版和服务器版的,我在生产环境中调整Windows2003跳板机使用的是Acronis.Disk.Director Server 10.0.20 ...

  10. SC || Chapter 5 复习向

    可复用性 ┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉ 行为子结构 对于父子的继承关系的要求: ·子类可以增加方法,但不可以删 ·子类需实现抽象类型中未实现的方法 ·子类重写(override)的方法必须 ...