题目链接:点击查看

题目大意:给出 n 个竹子,初始时高度为 h[ i ],接下来每一天每个竹子都会长高 a[ i ] 个单位的高度,每一天可以砍 k 次竹子(可以是同一个),每次可以砍掉 p 个单位的高度,现在问 m 天后,n 个竹子高度的最大高度的最小值是多少

题目分析:看到询问的答案是 “最大值的最小值” 不难想到二分,于是问题转换为了,给出高度 mid,如何判断 mid 是否合法

正着去思考的话,很难想出一种合法的贪心策略,不难看出的一个小结论是:时间靠后的 “砍” 操作一定比时间靠前的更有价值,对于同一次操作而言,我放在第 k 天来砍,和放在第 k + 1 天来砍来比较,第 k + 1 天的砍操作一定不可能更差(因为第 k 天砍的话,竹子的高度可能不足 p 个单位),所以我们考虑倒着去模拟 “砍” 的这个过程

因为我们二分的这个 mid 代表的意义是:“竹子最大高度的最小值”,所以我们不妨假设所有的竹子最后的高度都是 mid(显然是可行的),然后倒着去模拟整个过程,只会涉及到两种操作:

  1. 每个竹子会长高 a[ i ] 个高度,倒着的话就变成了:每个竹子会减少 a[ i ] 的高度
  2. 每一天可以砍 k 次竹子,每次可以砍掉 p 个单位的高度,倒这的话就变成了:某个竹子的高度增加 p

如此一来,贪心策略即成立,倒着去实现该过程即可,最后的目标是,每个位置的高度都需要大于等于 h[ i ],且在执行操作的过程中高度不允许出现负数

不过如果暴力去模拟的话,正确性是显然的,但时间复杂度扛不太住,所以考虑利用数据结构优化,门槛是找最小值的时间复杂度,动态寻找最小值不难想到堆,所以我们维护一个小根堆用于维护全局最小值,实时更新即可

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e5+100;LL n,m,k,p,h[N],a[N];struct Node
{int id;LL day,cnt;Node(){}Node(int id,LL day,LL cnt):id(id),day(day),cnt(cnt){}bool operator<(const Node& t)const{return day>t.day;}
};bool check(LL mid)
{priority_queue<Node>q;for(int i=1;i<=n;i++)if(mid-h[i]<m*a[i])//需要砍 q.push(Node(i,mid/a[i],0));for(int i=1;i<=m;i++){for(int j=1;j<=k;j++){if(q.empty())return true;Node cur=q.top();q.pop();if(cur.day<i)//特判一下过程中会出现负数return false;cur.cnt++;if(mid-h[cur.id]<m*a[cur.id]-cur.cnt*p)q.push(Node(cur.id,(mid+cur.cnt*p)/a[cur.id],cur.cnt));}}return q.empty();
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%lld%lld%lld%lld",&n,&m,&k,&p);for(int i=1;i<=n;i++)scanf("%lld%lld",h+i,a+i);LL l=0,r=1e13,ans=-1;while(l<=r){LL mid=l+r>>1;if(check(mid)){ans=mid;r=mid-1;}elsel=mid+1;}printf("%lld\n",ans);return 0;
}

CodeForces - 507E Breaking Good(二分+贪心)相关推荐

  1. CodeForces - 363D Renting Bikes(二分+贪心)

    题目链接:点击查看 题目大意:给出n个人,每人有元钱,再给出m辆自行车,每辆车需要元钱才能骑,现在n个人有a元的共享资金,问最多可以骑多少量自行车,并且使每个人的花费总和最小(即尽可能多的使用共享资金 ...

  2. 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)

    CF1041C Coffee Break(二分+贪心+set) 描述 Recently Monocarp got a job. His working day lasts exactly mm min ...

  3. codeforces Gym 100338E Numbers (贪心,实现)

    题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...

  4. 洛谷P1182 数列分段 Section II(二分+贪心)

    题目描述 对于给定的一个长度为N的正整数数列 A1∼NA _{1∼N}A1∼N​,现要将其分成 M(M≤N)M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一 ...

  5. CodeForces - 551C GukiZ hates Boxes(二分+贪心)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,表示每个位置的障碍物数量,现在有 m 个学生可以来搬走障碍物,每一秒钟可以做出的行为如下: 从位置 i 移动到位置 i + 1 从当前位置 ...

  6. CodeForces 670D2 Magic Powder - 2(二分+贪心)

    http://codeforces.com/contest/670/problem/D2 简单的二分,二分所有可以做的饼干数,然后遍历就可以啦 #include <iostream> #i ...

  7. 【codeforces 507E】Breaking Good

    [题目链接]:https://vjudge.net/contest/164884#problem/D [题意] 给你一张图; 图中有些路是完好的;但有些路还没修好; 先不管路有没有修好; 问你从起点到 ...

  8. Codeforces 671E Organizing a Race (贪心、线段树)

    题目链接 https://codeforces.com/contest/671/problem/E 题解 完全不会做--基本是抄lk的代码 ruogu的题解: https://www.luogu.co ...

  9. CodeForces - 1538G Gift Set(二分)

    题目链接:点击查看 题目大意:给出 a,b,x,ya,b,x,ya,b,x,y,分别表示有 aaa 个蓝色糖果和 bbb 和红色糖果,现在有两种打包方式: xxx 个蓝色糖果和 yyy 个红色糖果 y ...

最新文章

  1. RxJava 过滤操作符 take 与 takeLast
  2. Asp.NET中常用的一些优化性能的方法
  3. oracle 截取字段长度substr
  4. python中计算带分数_聊聊 python 数据处理全家桶(Redis篇)
  5. 影视中渐隐渐现特点作用_影视配音的技巧
  6. 函数的返回是返回给实参,然后由实参输出,返回值的作用是给输出的全部变为变量然后用.=连接好把变量存进数据库而不是输出完屏幕就拉倒了...
  7. 将页面中表格数据导出excel格式的文件(vue)
  8. Win7电脑,无法把文件保存到桌面上?
  9. pandas切片操作
  10. 百度地图个性化模板列表
  11. 2020年国内电影总票房突破100亿元
  12. 抢先一步 华为将于7月26日发布首款5G智能手机
  13. php登录注册案例,php实现登陆与注册的案例
  14. Matlab图像显示
  15. 是德科技N9020A 频谱分析仪技术资料说明
  16. insist fortress g55 机械键盘得救了
  17. 微信小程序云端图片上传,存储,获取,显示
  18. 【游戏设计】3D坦克大战
  19. win11 右键菜单恢复成win10样式(亲测有效)
  20. 【规则】Adblock Plus 广告过滤规则自用整理

热门文章

  1. Java文件能编译成lib吗_Makefile用于将一些.cpp和.h编译成lib
  2. 创建springmvc配置
  3. MySQL 高级 - 输入参数
  4. Nginx server_name精确匹配配置
  5. MyBatis 解决了什么问题?
  6. MyBatis 插件原理与自定义插件-插件编写与注册
  7. IntelliJ IDEA导入一个已经存在的子模块
  8. SpringMVC的请求-文件上传-单文件上传的代码实现2
  9. Bootstrap组件_分页
  10. html的属性与css的属性,HTML的属性和css基础