题目链接: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. MySQL 5.6新特性 -- Index Condition Pushdown

    Index Condition Pushdown(ICP)是针对mysql使用索引从表中检索行数据时的一种优化方法.   在没有ICP特性之前,存储引擎根据索引去基表查找并将数据返回给mysql se ...

  2. Ubuntu 13.10 解决虚拟机摄像头无法使用问题

    前段时间使用的是Ubuntu 13.04,使用virtualbox虚拟机 4.2版,虚拟机里边装的Windows 7和Windows8.1均无法使用摄像头.只要在USB设备中选上了摄像头,虚拟机系统准 ...

  3. HDU_3746 Cyclic Nacklace(KMP)

    题目请点我 题解: 题目大意:有一个字符串s.能够在前后加入字符,使字符串成为一个循环次数至少为2的循环字符串.输出最少须要加入的字符数目. 首先能够证明题目能够等价为仅仅在末尾加入字符使满足题意.要 ...

  4. 【Python】 sort、sorted高级排序技巧

    文章转载自:脚本之家 这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Pyth ...

  5. [Big Data - Kafka] Kafka设计解析(二):Kafka High Availability (上)

    Kafka在0.8以前的版本中,并不提供High Availablity机制,一旦一个或多个Broker宕机,则宕机期间其上所有Partition都无法继续提供服务.若该Broker永远不能再恢复,亦 ...

  6. 不8000就业,不还实习费的AICODER全栈实习二期开始报名

    4月17日是个伟大的日子,AICODER全栈实习一期班,正式开始!伙伴们已经撸起袖子加油干了. 二期班开始报名 二期班定于5月17日开班,从二期班开始,实习费用调整如下: 三个月模式实习费,调整为12 ...

  7. 【iCore4 双核心板_ARM】例程十三:SDIO实验——读取SD卡信息

    实验现象: 核心代码: int main(void) { system_clock.initialize(); led.initialize(); usart6.initialize(); usart ...

  8. win7(64bit)+python3.5+pyinstaller3.2安装和测试

    最近因为做项目需要,需要在win7中安装pyinstaller用于将.py文件生成脱离python平台的可执行程序*.exe文件. 安装步骤 第一步:安装python3.5 [下载python3.5的 ...

  9. OllyScripts 0.92帮助文档

    -------------------------------Olly脚本插件v0.92 制作: SHaG文档汉化:ZMWorm[CCG][TT]E-Mail:TranslationTeam[at]1 ...

  10. eBGP&iBGP 总结

    3.4 BGP 原文地址:http://mp.weixin.qq.com/s?src=3&timestamp=1500043305&ver=1&signature=XwiIVV ...