CF506C Mr. Kitayuta vs. Bamboos
CF506C Mr. Kitayuta vs. Bamboos
- 有nnn个竹子,第iii棵竹子第一天之前的高度是hih_ihi,每一天的末尾会长高aia_iai
- 每一天你可以将砍kkk刀,每一刀将一个竹子砍ppp,如果砍的竹子高度小于ppp,那么将会被砍到000.
- 求mmm天之后最高的竹子最矮是多少。
- 注意每一天是先砍竹子、再长竹子。
- n≤1e5,m≤1e4,k≤10n\le1e5,m\le1e4,k\le10n≤1e5,m≤1e4,k≤10,所有读入的数≤1e9\le1e9≤1e9。
Solution
- 考虑二分答案ansansans。然后有两种方法,这里重点介绍solution1:
- 显然每一个竹子最多砍c=max(0,⌈hi+aim−ansp⌉)c=max(0,\lceil\frac{h_i+a_im-ans}{p} \rceil)c=max(0,⌈phi+aim−ans⌉)刀,我们求出这ccc刀最早在什么时候砍,那么第一刀可以不砍满,后面的每一刀都要砍满,这样可以对于这个竹子让每一刀尽量往前排,然后要求这个竹子的每一刀都不能在这一刀之前砍,然后前往后扫一遍就可以了。
- 这个方法看起来就非常的假,为什么不能将某一刀均摊到前面的若干刀呢,而且如果预计的某一刀往后挪了,那么相当于浪费少了,后面的一刀的最早出现时间可不可以提前呢?
- 让我们来证明一下这个方法的正确性。
- 首先考虑第一刀之前能不能多砍一刀。根据对于第一刀的定义,往前砍并不能使得(hi+aim−ans)%p≤0(h_i+a_im-ans)\%p\le0(hi+aim−ans)%p≤0,即对于后面的刀数没有影响(也就是后面原本要砍多少刀,刀现在还是要砍),并且为了让下一刀最早,如果往前砍了,下一刀最早还是会落在上述的第一刀上,所以第一刀之前肯定不能砍。
- 考虑之后的几刀之前能不能砍,同理对于后面的刀数没有影响,按照原来的排列才能让每一刀最早能动。
- 最后考虑如果之前的某一刀被迫后移了,同样对于刀数没有影响,但是可能会使得后面排列整体后移(因为浪费少了),但是最早出现在原先的地方肯定是没有问题的。
- 综上,当且仅当在这些位置之后砍是最优的。
- 第二种方法就是反过来做,拔高竹子,贪心地取小于000的竹子,最后判定竹子的高度比初始高度要高即可。
Solution1:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 100005
#define ll long long
using namespace std;int n,m,K,i,j,k;
ll h[maxn],v[maxn],p,s[maxn];int check(ll lim){ll cnt=0;for(i=1;i<=n;i++) cnt+=max(0ll,(h[i]+v[i]*m-lim+p-1)/p);if (cnt>m*K) return 0;for(i=0;i<=m;i++) s[i]=0;for(i=1;i<=n;i++) if (h[i]+v[i]*m>lim){for(ll res=(h[i]+v[i]*m-lim)%p;res<=h[i]+v[i]*m-lim;res+=p) if (res){if (res<=h[i]) s[1]++; else if ((res-h[i]+v[i]-1)/v[i]+1>m) return 0; else s[(res-h[i]+v[i]-1)/v[i]+1]++;}}cnt=0;for(i=1;i<=m;i++){cnt+=s[i];cnt=max(0ll,cnt-K);}return !cnt;
}int main(){// freopen("ceshi.in","r",stdin);scanf("%d%d%d%lld",&n,&m,&K,&p);for(i=1;i<=n;i++) scanf("%lld%lld",&h[i],&v[i]);ll l=0,r=0,mid,ans;for(i=1;i<=n;i++) r=max(r,h[i]+v[i]*m);while (l<=r){mid=(l+r)>>1;if (check(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%lld",ans);
}
CF506C Mr. Kitayuta vs. Bamboos相关推荐
- [CF506C]Mr. Kitayuta vs. Bamboos
Description 有n个竹子,第i个竹子长度为h[i],每天的结束会长高a[i] 现在有m天,每一天可以做k次操作,每次操作可以选择一个竹子砍掉p,即高度h[i]=max(h[i]-p,0) 你 ...
- [CF505E]Mr. Kitayuta vs. Bamboos/[海军国际项目办公室]迷途竹林
Mr. Kitayuta vs. Bamboos 迷途竹林事实上就是经TiwAirOAO\color{red}{TiwAirOAO}TiwAirOAO巨佬扩大数据范围强化后的版本.真的是强化了吗 不过 ...
- Mr. Kitayuta vs. Bamboos
Mr. Kitayuta vs. Bamboos 题目链接:http://codeforces.com/problemset/problem/505/E 参考:http://blog.csdn.net ...
- 【IOI2020国家集训队作业 Part 1】CF505E Mr. Kitayuta vs. Bamboos
题目 题目描述 Mr. Kitayuta's garden is planted with nn bamboos. (Bamboos are tall, fast-growing tropical p ...
- Mr. Kitayuta vs. Bamboos[二分+贪心][图像分析]
文章目录 题目 思路 代码 题目 思路 首先最大值最小考虑二分,假设我们检验 xxx 但是发现检验比较难写 尝试从图像分析 那么画出来图像大致如下: 然后我们发现可以将图像上移末端重合至 (m,x)( ...
- CF506 C Mr. Kitayuta vs. Bamboos (贪心)
题意 有n根竹子,初始高度是h[i],每天结束时会长高a[i],每天你可以砍K刀,一刀能减小p的高度.可以在某一天内砍相同的竹子多次.问m天结束后,最高的竹子最矮是多高. n≤1e5,k≤10,m≤5 ...
- 【每日一题】8月12日题目精讲 Mr. Kitayuta, the Treasure Hunter
来源:牛客网: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 The Shuseki I ...
- 505B. Mr. Kitayuta‘s Colorful Graph
B. Mr. Kitayuta's Colorful Graph:题目 一开始就像到了DFS,并查集也不难想到. 弗洛伊德算法倒是不容易想到,平时不这么用..... #include <bits ...
- Mr. Kitayuta‘s Technology CodeForces - 505D(并查集+拓扑排序或dfs找环) 题解
题目 Shuseki Kingdom is the world's leading nation for innovation and technology. There are n cities ...
最新文章
- U^2-Net跨界肖像画,完美复刻人物细节,GitHub标星2.5K+
- 2017级数据结构助教批改方案
- ML之kNN:k最近邻kNN算法的简介、应用、经典案例之详细攻略
- 几家OA厂商介绍及产品特点总结
- 初学python之路-day18
- 《剑指offer》栈的压入、弹出序列
- mysql的sql执行过程和explain语句
- ajax漏洞 console_在实战中可能碰到的几种ajax请求方法详解
- 用matlab录制声音然后进行读取和播放
- 全国主要城市不同日照标准的间距系数
- 阿里云服务器centos7 安装docker 和docker-compose 及相关命令
- minimax算法_如何通过使用minimax算法使Tic Tac Toe游戏无与伦比
- 动画 | 什么是红黑树?(与2-3树等价)
- Maven---尚硅谷学习笔记Eclipse版
- 郝萌主的微信公众号上线了
- Bad Smell (代码的坏味道)
- 电子专业毕业后,到底能做什么?
- PCB抄板最新方法及步骤
- 企业网路神警上网行为监管系统
- 信奥一本通 1396:病毒(virus)