题目链接:https://codeforces.com/contest/1132/problem/D

题意:

有 $n$ 个学生,他们的电脑有初始电量 $a[1 \sim n]$,他们的电脑每分钟会耗电 $b[1 \sim n]$,现在有一场比赛持续 $k$ 分钟。

要你买一个充电器,使得每个学生的电脑在比赛期间的任何时候的电量都不会低于 $0$(可以等于 $0$),你要求出这个充电器每分钟充电量最少是多少。

题解:

看到这种题目,应当条件反射想到二分。

假设我们现在知道充电器每分钟的充电量是 $x$,那么如何确保比赛能够进行呢?

一台电脑的初始电量为 $a$,耗电量为 $b$,如果不充电的话,显然在 $\lfloor \frac{a}{b} \rfloor+1$ 这一分钟是最后一分钟了,再下一分钟就负电量了。

所以,我们找到这个 $\lfloor \frac{a}{b} \rfloor$ 最小的电脑,这是最快用完电的那台电脑,我们应当优先给他充电。

所以在当前这一分钟,我们选择给它冲一分钟的电,很重要的一个思想,我们此时不维护每个电脑的当前电量,而是在初始电量上直接加上 $x$,因为这两个操作是等价的。

然后在下一分钟,我们继续找此时最快会没电的电脑,继续给它充一分钟的电。

这样一来,对于一个 $x$ 进行check的时间复杂度是 $O((k+n)\log n)$,而二分 $x$ 的范围是 $[0,k \cdot \max_{i=1}^{n}(b_i)]$,记 $L = k \cdot \max_{i=1}^{n}(b_i)$。所以总时间复杂度是 $O(\log L \cdot (k+n) \cdot \log n)$。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+; int n,k;
ll a[maxn],b[maxn]; struct Qnode{
ll a,b;
ll r;
bool operator<(const Qnode& oth)const {
return r>oth.r;
}
}; inline bool check(ll x)
{
priority_queue<Qnode> Q;
for(int i=;i<=n;i++) Q.push((Qnode){a[i],b[i],a[i]/b[i]});
for(int t=;t<=k;t++)
{
Qnode q=Q.top(); Q.pop();
if(q.a/q.b+1ll<t) return ;
if(q.a/q.b+1ll>=k) return ;
Q.push((Qnode){q.a+x,q.b,(q.a+x)/q.b});
}
return ;
}
int main()
{
ios::sync_with_stdio();
cin.tie(), cout.tie(); cin>>n>>k;
for(int i=;i<=n;i++) cin>>a[i];
ll bmax=;
for(int i=;i<=n;i++) cin>>b[i], bmax=max(b[i],bmax); ll l=, r=(k-)*bmax+;
while(l<r)
{
ll mid=(l+r)>>;
if(check(mid)) r=mid;
else l=mid+;
}
if(l>=(k-)*bmax+) cout<<-<<'\n';
else cout<<l<<'\n';
}

注意,这个题还有一个点,就是优先队列里的元素,我们按照 $a/b$ 来排序,需要开一个变量 $r = a / b$ 来减少六十四位除法的次数,来加快比较速度,否则会TLE。

Codeforces 1132D - Stressful Training - [二分+贪心+优先队列]的更多相关文章

  1. codeforces 803D Magazine Ad(二分+贪心)

    Magazine Ad 题目链接:http://codeforces.com/contest/803/problem/D ——每天在线,欢迎留言谈论. 题目大意: 给你一个数字k,和一行字符 例: g ...

  2. CodeForces - 343C Read Time (二分+贪心)

    题意:有N个指针头,M个标记,用这N个针头扫描所有的标记,针头之间互不影响,求扫描完M个标记的最短时间 分析:二分搜答案,mid为时间限制,则只要所有的点在mid秒内被扫描到即可. 对于每个指针,若其 ...

  3. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  4. C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列

    C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  5. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  6. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

  7. hihoCoder 1309:任务分配 贪心 优先队列

    #1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN,  ...

  8. UVA 11134 - Fabled Rooks(贪心+优先队列)

    We would like to place  n  rooks, 1 ≤  n  ≤ 5000, on a  n×n  board subject to the following restrict ...

  9. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

随机推荐

  1. Visual Studio 统计代码行数

    介绍一种简单的统计代码行数的小技巧, 使用正则表达式,用VS强大的查找功能 b[^:b#/]+.$ 最后结果:

  2. Type Call requires API level 11 (current min is 8)解决办法

    解决办法: 1:project-->clean.. 2:右键工程-->Android Tools-->clean lint markers 3:修改AndroidManifest.x ...

  3. 基于Centos搭建 Mono 开发环境

    系统要求: CentOS 7.2 64 位操作系统 安装 Mono 安装前的准备 yum install yum-utils 执行命令添加安装包仓库 rpm --import "http:/ ...

  4. String s = new String("xyz");产生了几个对象?

    面试官Q1:请问String s = new String("xyz");产生了几个对象? 对于这个问题,老套路先上代码: public class StringTest { pu ...

  5. iOS开发之Xcode9报错 Compiling IB documents for earlier than iOS7 is no longer supported.

    升级到Xcode9时,最低的编译版本为iOS8,但是在使用一些SDK的时候就会报出Compiling IB documents for earlier than iOS7 is no longer s ...

  6. R语言编程艺术#03#列表(list)

    向量的元素要求都是同类型的,而列表(list)与向量不同,可以组合多个不同类型的对象.类似于C语言中的结构体(struct)类型. 1.创建列表 从技术上讲,列表就是向理.之前我们接触过的普通向量都称 ...

  7. Apache Spark 2.2.0 正式发布

    本章内容: 待整理 参考文献: Apache Spark 2.2.0正式发布 Spark Release 2.2.0

  8. MySql实现sequence功能的代码

    使用函数创建自增序列管理表(批量使用自增表,设置初始值,自增幅度) 第一步:创建Sequence管理表 sequence DROP TABLE IF EXISTS sequence; CREATE T ...

  9. Django项目实战 - html中用户登录判断

    实现逻辑: {% if request.user.is_authenticated %} 个人信息{% else %}登录{% endif %} 直接上代码 {% if request.user.is ...

  10. Android开发(十五)——ListView中Items的间距margin

    ListView中Items没有margin 参考:http://www.cnblogs.com/xitang/p/3677528.html