题面

传送门

分析

二分答案,考虑如何判定

可以用贪心的方法,每次找最快没电的电脑,在没电前1单位时间给它充电

正确性显然

实现上可以维护一个堆,存储每个电脑电用完的时刻,每次从堆顶取出最小的一个给它充电。设二分值为mid,对于每个电脑记录它的充电次数num[i],则没电的时间就是\(\lfloor \frac{a_i+num_i\times mid}{b_i} \rfloor+1\)

如果在维护堆的过程中发现当前时间已经超过某个电脑的没电时间,则返回false

时间复杂度\(O(n\log n \log ans)\)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 200005
using namespace std;
struct node{
long long dtim;
int id;
node(){ }
node(int i,long long t){
id=i;
dtim=t;
}
friend bool operator < (node p,node q){
return p.dtim>q.dtim;
}
};
int n,k;
long long a[maxn],b[maxn];
long long num[maxn];
bool check(long long add){
priority_queue<node>q;
for(int i=1;i<=n;i++){
q.push(node(i,a[i]/b[i]+1));
num[i]=0;
}
for(int i=1;i<=k;i++){
node now=q.top();
q.pop();
if(now.dtim<i) return 0;
num[now.id]++;
long long sum=a[now.id]+num[now.id]*add;
q.push(node(now.id,sum/b[now.id]+1));
}
return 1;
} int main(){
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%I64d",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%I64d",&b[i]);
}
long long l=0,r=1e13,ans=-1,mid;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)){
ans=mid;
r=mid-1;
}else l=mid+1;
}
printf("%I64d\n",ans);
}

Codeforces 1132D(二分答案+堆)的更多相关文章

  1. Codeforces Round #425 (Div. 2) Problem C Strange Radiation (Codeforces 832C) - 二分答案 - 数论

    n people are standing on a coordinate axis in points with positive integer coordinates strictly less ...

  2. codeforces 359D 二分答案+RMQ

    上学期刷过裸的RMQ模板题,不过那时候一直不理解>_< 其实RMQ很简单: 设f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值or最大值 那么f[i][j]=min/max{ ...

  3. Electric Charges CodeForces - 623C (二分答案)

    大意: 平面上n个点每个点坐标为(x,0)或(0,y), 求任意两点距离平方最大值的最小值. 二分答案, 转化为判定最大值是否<=e, 按$x$排序后, 因为固定左端点, $y$绝对值的最大值是 ...

  4. CodeForces 483B 二分答案

    题目: B. Friends and Presents time limit per test 1 second memory limit per test 256 megabytes input s ...

  5. CodeForces 549H | 二分答案

    参考了这个博客哇 #include<cstdio> #include<algorithm> #include<cstring> #define Max(a,b,c, ...

  6. Codeforces 551C GukiZ hates Boxes 二分答案

    题目链接 题意:  一共同拥有n个空地(是一个数轴,从x=1 到 x=n),每一个空地上有a[i]块石头  有m个学生  目标是删除全部石头  一開始全部学生都站在 x=0的地方  每秒钟每一个学生都 ...

  7. Codeforces 700A As Fast As Possible(二分答案)

    [题目链接] http://codeforces.com/problemset/problem/700/A [题目大意] 有一辆限载k人速度为v2的车,n个步行速度均为v1的人要通过一段长度为l的距离 ...

  8. BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案

    BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案 Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者, ...

  9. Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)

    链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...

随机推荐

  1. vue脚手架安装

    1. 脚手架:  如何:   1. 安装脚手架的工具命令:      npm i -g @vue/cli   电脑安装完命令后  :  直接创建  vue create 文件夹名字   2. 用命令反 ...

  2. IDEA中web项目maven项目手动打war包的方式

    手动打包 https://blog.csdn.net/ibigboy/article/details/90287963 tomcat部署web项目方法 https://www.cnblogs.com/ ...

  3. 20180209-sys模块

    sys模块常用操作如下: 1.命令行参数 sys.argv  第一个元素是程序本身路径 # 1.命令行参数 第一个元素是程序本身路径 ret = sys.argv print('命令行参数:',ret ...

  4. 《深入学习Redis(1):Redis内存模型 》笔记,待完善

    参考资料 https://www.cnblogs.com/kismetv/p/8654978.html 一.内存统计 info memory 查看内存统计 五.应用举例

  5. ConcurrentSkipListMap--跳表的简单使用

    import java.util.Map; import java.util.concurrent.ConcurrentSkipListMap; /** * 跳表的使用 */ public class ...

  6. docker-compose运行ES, Kibana和Cerebro

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11764003.html docker-compose.yaml version: '2.2' serv ...

  7. 【leetcode】823. Binary Trees With Factors

    题目如下: Given an array of unique integers, each integer is strictly greater than 1. We make a binary t ...

  8. phpLite 压缩包 百度云网盘资源

    链接: https://pan.baidu.com/s/1b6EnClYOznWa0OFgk4aNQg 密码: gpup

  9. python 爬取<a>标签内href的方法及遇到的问题

    原博客地址: https://www.cnblogs.com/dengyg200891/p/6060010.html # -*- coding:utf-8 -*- #python 2.7 #XiaoD ...

  10. 企业级Web服务器安全主动防御措施

    篇一 : 企业级Web服务器安全主动防御措施 Web服务器现在已经成为了病毒.木马的重灾区.不但企业的门户网站被篡改.资料被窃取,而且还成为了病毒与木马的传播者.有些Web管理员采取了一些措施,虽然可 ...