CF1132D Stressful Training
题目
见链接。
题解
方法一
知识点:贪心,优先队列,二分。
显然,这道题可以用二分答案做。check 函数可以用小根堆,让维持时间最小的先充电。
但是不优化这道题会炸。有两个关键优化:一个是快读快写能省不少时间,还有一个是把维持天数当一个变量存起来以免重复运算浪费时间。其他一些小优化:用 pop 把元素弹出代替析构函数自己初始化能省一点时间,只让天数小于 \(k\) 的电脑入队,每次充完电检测维持天数小于 \(k\) 的才重新入队。优化前是超 \(3\) 秒限制的,优化后是 \(1.5\) 秒还算可以。
时间复杂度 \(O((n+k)\log n)\) ,常数应该在 \((100,1000)\)
空间复杂度 \(O(n)\)
方法二
知识点:贪心,二分。
方法一的检验并非正解,其实有一个更妙的方法去验证电脑是否会在 \(k\) 天之前关机。
我们用一个数组 \(cnt[i]\) 表示有多少电脑最晚第 \(i\) 天前要充一次电。比如一台电脑是初始电量是 \(20\) 每天耗电 \(15\) 要维持到 \(8\) 天,每次充电 \(40\) ,那么它最晚在第 \(2\) 、\(5\)、\(7\) 天要充一次电,于是 \(cnt[\{2,5,7\}]\) 都要加一。
我们不关心电脑在哪天充电,我们只关心电脑最晚要在什么时候前充电,所以 \(cnt[i]\) 在某些天超过 \(1\) 是可行的。因为既然我们知道在这天之后有三台电脑会关机,只要在这天之前什么时候充电都行,不过要满足之前有空闲的天数。
于是,现在我们把它从 \(1\) 到 \(i\) 累和,得到一个结果 \(sum\) ,表示到 \(i\) 天要至少要充几次电,显然每天只能充一次,那么如果 \(sum > i\) ,则存在电脑没在最晚时间前充上电,关机了,是这个答案是不可行的。如果 \(sum \leq i\) ,说明到第 \(i\) 天充电次数完全够用,可以继续。
时间复杂度 \(O(n+k)\) ,常数在 \((50,200)\)
空间复杂度 \(O(n+k)\)
代码
方法一
#include <bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read() {
ll x = 0, f = 1;
char c = getchar();
while (c < '0' || c>'9') {
if (c == '-') f = -1;
c = getchar();
}///整数符号
while (c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}///挪位加数
return x * f;
}///关键优化,快读
struct node {
ll a, b, v;///关键优化,存储天数
bool operator>(const node &x) const {///大根堆重载小于,小根堆重载大于,true代表优先级小,必须是常函数或者友元函数
return v > x.v;
}
}a[200007];
int n, k;
// struct cmp {
// bool operator()(const node &a, const node &b) {
// return a.a / a.b > b.a / b.b;
// }
// } ///也可以写个比较类
priority_queue<node, vector<node>, greater<node>> pq;
//priority_queue<node, vector<node>, cmp> pq;
bool check(ll mid) {
while (!pq.empty()) pq.pop();///优化
for (int i = 0;i < n;i++) if (a[i].v < k)pq.push(a[i]); ///优化
for (int i = 1;i <= k;i++) {
if (pq.empty()) return true;
node x = pq.top();
pq.pop();
if (x.v < i) return false;///加之前判断是否能撑到这个时候
x.a += mid;
x.v = x.a / x.b + 1;
if (x.v < k) pq.push(x);///优化
}
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
n = read();
k = read();
for (int i = 0;i < n;i++) a[i].a = read();
for (int i = 0;i < n;i++) a[i].b = read(), a[i].v = a[i].a / a[i].b + 1;///因为一天结束才扣电,而到了这天就算,所以取下整能过几天,加一是往后一天也算到了。
ll l = 0, r = 2e12;
while (l <= r) {
ll mid = l + r >> 1;
if (check(mid)) r = mid - 1;
else l = mid + 1;
}
cout << (l > 2e12 ? -1 : l) << '\n';
return 0;
}
方法二
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n, k;
ll a[200007], b[200007];
bool check(ll mid) {
int r = k;
vector<int> sum(k);
for (int i = 0;i < n;i++) {
ll tmp = a[i];
while (tmp / b[i] + 1 < k && r >= 0) {
sum[tmp / b[i] + 1]++;
tmp += mid;
r--;
}
if (r < 0) return false;
}
for (int i = 1;i < k;i++) {
sum[i] += sum[i - 1];
if (sum[i] > i) return false;///充电次数超过天数,不可能实现
}
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> k;
for (int i = 0;i < n;i++) cin >> a[i];
for (int i = 0;i < n;i++) cin >> b[i];
ll l = 0, r = 2e12;
while (l <= r) {
ll mid = l + r >> 1;
if (check(mid)) r = mid - 1;
else l = mid + 1;
}
cout << (l > 2e12 ? -1 : l) << '\n';
return 0;
}
CF1132D Stressful Training的更多相关文章
- CF 3-6 2级组 D题 STRESSFUL TRAINING 紧张的比赛
题目大概是这样的: 给出一个数列a[n] ,对于每一个数 a [i] 来说 都会在 T - - 时 -= b[i] 每个数都在任何时刻不能小于0 你可以在每次T - - 之前时给 一 个 a[i] + ...
- 【Codeforces 1132D】Stressful Training
Codeforces 1132 D 题意:给\(n\)个电脑的电量和耗电速度,你可以买一个充电器,它的充电速度是每秒\(v\)单位,\(v\)你自己定.问最小的\(v\)能使得在\(k\)秒内每秒给某 ...
- Codeforces 1132D - Stressful Training - [二分+贪心+优先队列]
题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有 $n$ 个学生,他们的电脑有初始电量 $a[1 \sim n]$,他们的电脑每分钟会耗 ...
- CF集萃1
因为cf上一堆水题,每个单独开一篇博客感觉不太好,就直接放一起好了. CF1096D Easy Problem 给定字符串,每个位置删除要代价.求最小代价使之不含子序列"hard" ...
- Codeforces 1132 - A/B/C/D/E/F - (Undone)
链接:http://codeforces.com/contest/1132 A - Regular Bracket Sequence - [水] 题解:首先 "()" 这个的数量多 ...
- CF1132.Educational Codeforces Round 61(简单题解)
A .Regular Bracket Sequence 题意:给定“((” , “()” , “)(”, “))”四种,问是否可以组成合法括号匹配 思路:设四种是ABCD,B可以不用管,而C在A或 ...
- Educational Codeforces Round 61 (Rated for Div. 2) D,F题解
D. Stressful Training 题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有n台电脑,每台电脑都有初始电量ai,也有一个 ...
- CF 1132A,1132B,1132C,1132D,1132E,1132F(Round 61 A,B,C,D,E,F)题解
A.Regular bracket sequence A string is called bracket sequence if it does not contain any characters ...
- hdu 4946 2014 Multi-University Training Contest 8
Area of Mushroom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- Quantexa CDI(场景决策智能)Syneo平台介绍
Quantexa 大数据服务提供商, 使用实体解析, 关系分析和人工智能技术帮助客户进行数据处理和预防金融犯罪. 企业概览 2016年成立, 当前规模500人 服务特色是场景决策智能CDI(conte ...
- Bugku CTF练习题---MISC---贝斯手
Bugku CTF练习题---MISC---贝斯手 flag:flag{this_is_md5_and_base58} 解题步骤: 1.观察题目,下载附件 2.下载后进行解压,得到了一张图片.一个压缩 ...
- Bugku CTF练习题---社工---信息查找
Bugku CTF练习题---社工---信息查找 flag:KEY{462713425} 解题步骤: 1.观察题目,思考题目内容,了解答案是群号 2.这里涉及到好多的信息,首先有网址,第二个是今日头条 ...
- Abp集成HangFire
简要说明 后台作业在系统开发的过程当中,是比较常用的功能.因为总是有一些长耗时的任务,而这些任务我们不是立即响应的,例如 Excel 文档导入.批量发送短信通知等. ABP vNext 提供了后台作业 ...
- 中间件漏洞之Nginx
中间件漏洞之Nginx 我们常见的中间件有IIS.Apache.Nginx,其中Nginx中间件有什么漏洞呢? Nginx 文件名逻辑漏洞(CVE-2013-4547): 漏洞版本: Nginx 0. ...
- 初始C语言作业一
1.下面哪个不是C语言内置的数据类型:( ) A.char B.double C.struct Stu D.short 解析: C语言中内置类型包括 char //字符数据类型 short //短整型 ...
- 2020级cpp机考模拟题A卷-#题解1
为了各位朋友的身心健康(不是),我们按照题目难度顺序来写题解. 第一次写题解,希望多点包容和鼓励(恬不知耻 1:谁先输出-4 题意: 输入3个整数,按从大到小的顺序输出,每两个数字间加一个空格. 题解 ...
- 《Effective C++》阅读总结(二):类的构造、析构和赋值
今天是周六早上,但很不幸待会儿还是要去公司,本月kpi还剩一些工作要做,这个月计划的Effective C++学习,也基本完成了,最后一章节模板相关那部分还看不太懂,就大概过了一遍.现在是收尾总结阶段 ...
- poj3784(对顶堆)
题意:多组数据,让你求出1~i(i为奇数&&i<=n)的中位数 思路:首先复杂度必为O(n)或O(nlogn)的(数据范围) 思索,如果题目要求1次中位数,好求!排个序,取a[( ...
- Link-Cut-Tree(1)
参考论文 求解范围:(动态树问题) 树上路径查询.修改 动态连边.删边 换根 lca 算法逻辑 概念: 类似树链剖分,把一棵树拆成许多链,每个链用splay维护(链上的为实边,否则为虚边),splay ...