要点

  • 二分显然,关键在于怎么判断
  • 题解方法:开k个队列代表每个时间有哪些电脑会挂掉,这部分O(n)预处理一下,之后扫一遍时间,每个时间点贪心选取最靠前的会挂的电脑未雨绸缪给它充电,然后看看充电以后要不要换队列,这样就把n * k的变成了n + k的
  1. const int maxn = 2e5 + 5;
  2. int n;
  3. ll k;
  4. ll a[maxn], b[maxn], cur[maxn];
  5. queue<int> Q[maxn];
  6. bool ok(ll mid) {
  7. rep(i, 0, k) while(Q[i].size()) Q[i].pop();
  8. rep(i, 1, n) {
  9. cur[i] = a[i];
  10. ll t = cur[i] / b[i] + 1;
  11. if (t <= k) Q[t].push(i);
  12. cur[i] %= b[i];
  13. }
  14. int p = 0;
  15. rep(i, 0, k) {
  16. while (p <= k && Q[p].empty()) p++;
  17. if (p > k) return true;
  18. if (p <= i) return false;
  19. int t = Q[p].front();
  20. if (cur[t] + mid < b[t]) {
  21. cur[t] += mid;
  22. continue;
  23. }
  24. Q[p].pop();
  25. ll d = (cur[t] + mid) / b[t];
  26. if (p + d <= k) Q[p + d].push(t), cur[t] = (cur[t] + mid) % b[t];
  27. }
  28. return true;
  29. }
  30. int main() {
  31. ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  32. cin >> n >> k;
  33. k--;
  34. rep(i, 1, n) cin >> a[i];
  35. rep(i, 1, n) cin >> b[i];
  36. ll l = 0, r = INF, ans = -1;
  37. while (l <= r) {
  38. ll mid = (l + r) >> 1;
  39. if (ok(mid)) {
  40. r = mid - 1;
  41. ans = mid;
  42. } else l = mid + 1;
  43. }
  44. cout << ans << endl;
  45. return 0;
  46. }

Codeforces 1132D(二分模拟)的更多相关文章

  1. Codeforces 1132D(二分答案+堆)

    题面 传送门 分析 二分答案,考虑如何判定 可以用贪心的方法,每次找最快没电的电脑,在没电前1单位时间给它充电 正确性显然 实现上可以维护一个堆,存储每个电脑电用完的时刻,每次从堆顶取出最小的一个给它 ...

  2. Codeforces Round #379 (Div. 2) A B C D 水 二分 模拟

    A. Anton and Danik time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  3. Codeforces 1132D - Stressful Training - [二分+贪心+优先队列]

    题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有 $n$ 个学生,他们的电脑有初始电量 $a[1 \sim n]$,他们的电脑每分钟会耗 ...

  4. Codeforces 1011C Fly(二分+模拟)

    题意: 是有n个星球,1代表地球,然后输入一个m表示火箭的重量,然后输入了两组n个数,第一组表示在每个星球起飞时消耗一吨燃料的质量数,a[i]就表示每a[i]吨就要消耗1吨燃料,第二组就表示在每个星球 ...

  5. Codeforces 389B(十字模拟)

    Fox and Cross Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submi ...

  6. codeforces 591B Rebranding (模拟)

    Rebranding Problem Description The name of one small but proud corporation consists of n lowercase E ...

  7. Codeforces 626B Cards(模拟+规律)

    B. Cards time limit per test:2 seconds memory limit per test:256 megabytes input:standard input outp ...

  8. CodeForces - 363D --二分和贪心

    题目:CodeForces - 363D 题意:给定n个学生,其中每个学生都有各自的私己钱,并且自己的私己钱只能用在自己买自行车,不能给别人. 给定m个自行车,每个自行车都有一个价格. 给定公有财产a ...

  9. 【Codeforces 1132D】Stressful Training

    Codeforces 1132 D 题意:给\(n\)个电脑的电量和耗电速度,你可以买一个充电器,它的充电速度是每秒\(v\)单位,\(v\)你自己定.问最小的\(v\)能使得在\(k\)秒内每秒给某 ...

随机推荐

  1. 搭建iis本地测试服务器

    在“开始”选择 “控制面板”,默认是以“类别”显示,   改成“小图标”显示   选择“程序和功能”   进入界面后,点击“启动或关闭Windows功能”   然后勾选图中的两个选框,注意一定要显示为 ...

  2. UVA10561 Treblecross —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-10561 题意: 两个人玩游戏,轮流操作:每次往里面添加一个X,第一个得到XXX的获胜. 题解: 详情请看<训练指南&g ...

  3. [原创]Java开发如何在线打开Word文件

    此方案使用了PageOffice产品实现在线打开Word文档: 1. 首先从PageOffice官网下载产品开发包,http://www.zhuozhengsoft.com/dowm/ ,下载Page ...

  4. 数学题--On Sum of Fractions

    题目链接 题目意思: 定义v(n)是不超过n的最大素数, u(n)是大于n的最小素数. 以分数形式"p/q"输出 sigma(i = 2 to n) (1 / (v(i)*u(i) ...

  5. distutils 打包setup.py

    from distutils.core import setup setup(name='hello', version='1.0', description='test example', auth ...

  6. CF 757E Bash Plays with Functions——积性函数+dp+质因数分解

    题目:http://codeforces.com/contest/757/problem/E f0[n]=2^m,其中m是n的质因子个数(种类数).大概是一种质因数只能放在 d 或 n/d 两者之一. ...

  7. P4147玉蟾宫——最大子矩阵

    悬线法裸题. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace ...

  8. button的FlatStyle和FlatAppearance属性

    FlatStyle是处理边框的样式,而FlatAppearance是用来设置边框的颜色,宽度和鼠标移动和点击时的效果设置FlatStyle为Flat,并且设置FlatAppearance下的Borde ...

  9. 安装ubuntu+Windows双系统, Windows启动项消失

    这里主要介绍grub分区损坏的问题: 首先介绍最简单的方法, 不确定能不能成功, 但是最好先用此方法, 毕竟最简单如果解决就不用下一个方法了. 1. (1)用U盘做一个ubuntu的镜像, 开机进入U ...

  10. Asset Catalog Help (三)---Adding Image Sets

    Adding Image Sets Organize versions of your images in image sets, which you can add to an asset cata ...