Codeforces 1132D(二分答案+堆)
题面
分析
二分答案,考虑如何判定
可以用贪心的方法,每次找最快没电的电脑,在没电前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(二分答案+堆)的更多相关文章
- 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 ...
- codeforces 359D 二分答案+RMQ
上学期刷过裸的RMQ模板题,不过那时候一直不理解>_< 其实RMQ很简单: 设f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值or最大值 那么f[i][j]=min/max{ ...
- Electric Charges CodeForces - 623C (二分答案)
大意: 平面上n个点每个点坐标为(x,0)或(0,y), 求任意两点距离平方最大值的最小值. 二分答案, 转化为判定最大值是否<=e, 按$x$排序后, 因为固定左端点, $y$绝对值的最大值是 ...
- CodeForces 483B 二分答案
题目: B. Friends and Presents time limit per test 1 second memory limit per test 256 megabytes input s ...
- CodeForces 549H | 二分答案
参考了这个博客哇 #include<cstdio> #include<algorithm> #include<cstring> #define Max(a,b,c, ...
- Codeforces 551C GukiZ hates Boxes 二分答案
题目链接 题意: 一共同拥有n个空地(是一个数轴,从x=1 到 x=n),每一个空地上有a[i]块石头 有m个学生 目标是删除全部石头 一開始全部学生都站在 x=0的地方 每秒钟每一个学生都 ...
- Codeforces 700A As Fast As Possible(二分答案)
[题目链接] http://codeforces.com/problemset/problem/700/A [题目大意] 有一辆限载k人速度为v2的车,n个步行速度均为v1的人要通过一段长度为l的距离 ...
- BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案
BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案 Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者, ...
- Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)
链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...
随机推荐
- Zookeeper——启动闪退
Zookeeper好久不启动了,昨天项目要用Zookeeper了,我昨天突然启动它,调皮的zk居然害羞不让我看见它,启动不了,一启动就闪退,为啥呢?其实是因为报错了,有错zk启动时就会报错,所以昨 ...
- 项目使用Kafka镜像报错处理记录:this server does not host this topic-partition
背景 项目使用docker swarm部署 服务之间使用消息中间件 kafka 通信 Kafka 使用 star 3.7k 的 wurstmeister/kafka:2.12-2.2.1 镜像 Zoo ...
- Pull Request的正确打开方式(如何在GitHub上贡献开源项目)
Pull Request的正确打开方式(如何在GitHub上贡献开源项目) GitHub的官方帮助如下: Fork A Repo: https://help.github.com/articles/f ...
- JSON —— 序列化与反序列化
1.JSON 反序列化 JSON 序列化:将服务器端的 JavaBean 对象转换成 JSON 字符串 JSON 反序列化:服务器端得到一个 JSON 字符串,然后将 JSON 字符串转换 JavaB ...
- JavaScript原型&原型链
原型&原型对象 先来一段简单的代码: function Fun(name) { this.name = name } var obj = new Fun('obj') JavaScript中的 ...
- python 面向对象(类)--学习笔记
面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...
- activemq---点对点/发布订阅模式简单代码示例
activemq 消息模式流程: ConnnectionFactory --> Connection --> Session --> Message ---ConnectionFac ...
- jsonp跨域获取数据实现百度搜索
本菜鸡最近在写某个页面请求数据时,报了如下的错误. Failed to load https://...:No 'Access-Control-Allow-Origin' header is pres ...
- java Map的四种遍历方式
1.这是最常见的并且在大多数情况下也是最可取的遍历方式,在键值都需要时使用. Map<Integer, Integer> map = new HashMap<Integer, Int ...
- Halo(十)
Spring Converter(转换器) @FunctionalInterface public interface Converter<S, T> { //一对一转换 @Nullabl ...