Codeforces 1132D - Stressful Training - [二分+贪心+优先队列]
题目链接: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 - [二分+贪心+优先队列]的更多相关文章
- codeforces 803D Magazine Ad(二分+贪心)
Magazine Ad 题目链接:http://codeforces.com/contest/803/problem/D ——每天在线,欢迎留言谈论. 题目大意: 给你一个数字k,和一行字符 例: g ...
- CodeForces - 343C Read Time (二分+贪心)
题意:有N个指针头,M个标记,用这N个针头扫描所有的标记,针头之间互不影响,求扫描完M个标记的最短时间 分析:二分搜答案,mid为时间限制,则只要所有的点在mid秒内被扫描到即可. 对于每个指针,若其 ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- 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 ...
- HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...
- 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心
/** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...
- hihoCoder 1309:任务分配 贪心 优先队列
#1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, ...
- UVA 11134 - Fabled Rooks(贪心+优先队列)
We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the following restrict ...
- 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心
题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...
随机推荐
- windows10多桌面创建 切换 和分屏
windows键+Tab 可以创建和切换新的桌面 win+ctrl+左右箭头 可以切换桌面 Aero Snap是Win7时代增加的一项窗口排列功能,俗称“分屏”.一个最简单例子,就是当你把窗口拖至屏幕 ...
- MySQL数据切分的相关概念和原理详解
对于数据切分,我们可能还不是很熟悉,但是它对于MySQL数据库来说也是相当重要的一门技术,本文我们就详细介绍一下MySQL数据库的数据切分的相关知识,接下来就让我们一起来了解一下这部分内容. 什么是数 ...
- 12C配置EM Express的https端口
1.启动监听并查看监听信息 $ lsnrctl stat ora12 LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 07-FEB-2017 ...
- MongoDB 聚合操作(转)
在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...
- 图文剖析自己定义View的绘制(以自己定义滑动button为例)
自己定义View一直是横在Android开发人员面前的一道坎. 一.View和ViewGroup的关系 从View和ViewGroup的关系来看.ViewGroup继承View. View的子类.多是 ...
- Android Studio Prettify 插件
1.功能:能够一键声明layout文件中的所有注明id的控件,节省时间 2.github地址 https://github.com/Haehnchen/idea-android-studio-plug ...
- pandas DataFrame(3)-轴
和numpy数组(5)-二维数组的轴一样,pandas DataFrame也有轴的概念,决定了方法是对行应用还是对列应用: 以下面这个数据为例说明: 这个数据是5个车站10天内的客流数据: rider ...
- 【iCore1S 双核心板_ARM】例程二:读取ARM按键状态
实验原理: 按键的一端与STM32的GPIO(PB9)相连,且PB9外接一个1k大小的限流上接电阻. 初始化时把PB9设置成输入模式,当按键弹起时,PB9由于上拉电阻的作用呈高电平(3.3V): 当按 ...
- 学习MongoDB(三) Add an Arbiter to Replica Set 集群中加入仲裁节点
Add an Arbiter to Replica Set 在集群中加入仲裁节点,当集群中主节点挂掉后负责选出新的主节点,仲裁节点也是一个mongo实力,但是它不存储数据. 1.仲裁节点消耗很小的资源 ...
- 看雪CTF第十五题
1.直接运行起来,再用OD附加 在此处luajit加载并调用main函数 004021C7 E8 64FE0000 call CrackMe. ; luaL_newstate 004021CC 8BF ...