题目链接:hdu_5884_Sort

题意:

有n个数,每个数有个值,现在你可以选择每次K个数合并,合并的消耗为这K个数的权值和,问在合并为只有1个数的时候,总消耗不超过T的情况下,最小的K是多少

题解:

首先要选满足条件的最小K,肯定会想到二分。

然后是如何来写这个check函数的问题

我们要贪心做到使消耗最小,首先我们将所有的数排序

然后对于每次的check的mid都取最小的mid个数来合并,然后把新产生的数扔进优先队列,直到最后只剩一个数。

不过这样的做法是n*(logn)2 ,常数写的小,带优化能卡过去,不过我反正卡不过去,然后就需要一个数据结构优化一个log

那就是用单调队列,可以先看看这篇文章  合并果子

然而这里有个小细节,不注意是过不去的:

对于n个数,一共要合并n-1个数,才能最后剩一个数,然后对于每次的mid,每次会合并mid-1个数,如果(n-1)%(mid-1)!=0,那么我们得先取(n-1)%(mid-1)+1个数来合并,这样后面合并的时候才能刚合适,如果不取,读者可以自己模拟一下,会出错。

 #include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
typedef long long ll; const int N=1e5+;
int t,n,T,a[N];
ll inf=1e18;
queue<ll>Q1,Q2; bool check(int mid)
{
ll ans=;
while(!Q1.empty())Q1.pop();
while(!Q2.empty())Q2.pop();
F(i,,n)Q1.push(a[i]);
int num=(n-)%(mid-);
if(num)
{
ll tp=;
F(i,,num+)tp+=Q1.front(),Q1.pop();
ans+=tp;
Q2.push(tp);
}
while()
{
ll tp=;
F(i,,mid)
{
ll x=inf,y=inf;
if(Q1.empty()&&Q2.empty())break;
if(!Q1.empty())x=Q1.front();
if(!Q2.empty())y=Q2.front();
if(x<y)tp+=x,Q1.pop();
else tp+=y,Q2.pop();
}
ans+=tp;
if(ans>T)return ;
if(Q1.empty()&&Q2.empty())break;
Q2.push(tp);
}
return ans<=T;
} int main(){
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&T);
F(i,,n)scanf("%d",a+i);
sort(a+,a++n);
int l=,r=n,mid,ans;
while(l<=r)mid=(l+r)>>,check(mid)?r=mid-,ans=mid:l=mid+;
printf("%d\n",ans);
}
return ;
}

hdu_5884_Sort(二分+单调队列)的更多相关文章

  1. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  2. [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  3. NOIP模拟 最佳序列 - 二分 + 单调队列

    题意: 各一个n(\(\le 20000\))的序列,定义纯洁序列为长度len满足\(L \le len \le R\)的序列,纯洁值为某一纯洁序列的平局值,输出所有纯洁序列中最大平均值. 分析: 二 ...

  4. [USACO12MAR]花盆 二分 单调队列

    [USACO12MAR]花盆 二分 单调队列 存在一个长度为\(x\)的区间\([l,r]\),使得区间中最大值与最小值差至少为\(w\),求这个最小的\(x\) \(n\le 100000\),\( ...

  5. hdu-3276-dp+二分+单调队列

    Star Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)

    传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...

  7. HDU - 5289 Assignment (RMQ+二分)(单调队列)

    题目链接: Assignment  题意: 给出一个数列,问其中存在多少连续子序列,使得子序列的最大值-最小值<k. 题解: RMQ先处理出每个区间的最大值和最小值(复杂度为:n×logn),相 ...

  8. 【BZOJ2806】[Ctsc2012]Cheat 广义后缀自动机+二分+单调队列优化DP

    [BZOJ2806][Ctsc2012]Cheat Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的 ...

  9. Gym 100801J Journey to the "The World's Start"(二分+单调队列)

    题意: 现在有1,2,3...N这N个站, 给定限定时间Limt,  N-1种票的价格, 分别对应一个最远距离,  叫你选择一种票, 满足可以在规定时间到达N站台,而且价格最低 思路: 如果买距离为L ...

随机推荐

  1. Activiti工作流入门

    Activiti简介 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度. Activiti 作为一个遵从 Apache 许可的工 ...

  2. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解

    Jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本.打印出某个java进程(使用pid)内存内的,所有'对象'的情况(如:产生那些对象,及其数量). 使用方法 ...

  3. C语言指针、地址、赋值三者含义

    先来一个观点.大家先看看对不对 按:在CSDN论坛上,有位坛友提到这个问题: ==================================== 先看一段代码: #include<stdi ...

  4. php一些函数及方法...

  5. 简单入门使用GitHub总结

    简单入门使用GitHub总结 ps: 试着自己弄一下GitHub,发现问题多多,中间还差点把自己的资料给全部弄没了(直接摔啦~). 然后网上查找各种资料进行设置终于成功了. 以下是参考的资料链接: G ...

  6. svn 常用控制台命令解析

    参数说明 :serverPath:表示服务器的文件路径 ,  localPath:表示本地的文件路径  , num 表示数字 , edition1:表示工程已经跟新的版本1 , edition2:表示 ...

  7. UIColor,CGColor,CIColor三者间的区别和联系

    一.UIColor UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化.UIColor包含了一些类方法用于创建一 ...

  8. 区块链Fabric技术在托管业务中的运用初探

    区块链Fabric技术在托管业务中的运用初探 什么是Fabric技术 HyperLedger是IBM.Intel等多家公司正开展的一个区块链项目,包含了Fabric.Iroha等多项技术,其中最为活跃 ...

  9. vim 常用操作

    a 进入INSERT MODE x 删除当前光标下的字符dw 删除光标之后的单词剩余部分.d$ 删除光标之后的该行剩余部分.dd 删除当前行. c 功能和d相同,区别在于完成删除操作后进入INSERT ...

  10. matlab读xls数据

    [ndata,label,abalone]=xlsread('data.xls') ndata:表示数字属性 label:表示类别属性 abalone:全部数据