博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mr. Kitayuta vs. Bamboos
阅读量:6354 次
发布时间:2019-06-22

本文共 1923 字,大约阅读时间需要 6 分钟。

Mr. Kitayuta vs. Bamboos

题目链接:

参考:

贪心,二分

从数据规模上看,算法复杂度只能为O(n)或者O(nlgn),似乎不能直接求值,考虑二分MAX将求值问题转化为判定性问题。然而考虑到砍伐后竹子高度变为0的特殊情况,考虑倒着做,即初始时每个竹子高度均为MAXi,每天晚上每个竹子会减少高度a[i],每天白天可以选择对其中不超过K个竹子选择将其的高度增加P,并且保证任何时刻任何竹子高度均大于等于0,m天后是否可以让每个竹子高度均大于等于h[i]。

证明倒着推的正确性:只有在m天后每个竹子高度均大于等于h[i],才能让所有的竹子按照原来正向的顺序,以和倒着做相同的操作反过来让每个竹子最终的高度小于等于MAXi,见下图,绿色线代表倒着推的话一根竹子的每天生长情况,蓝色线代表正着推的话一根竹子的每天生长情况(来自Codeforces官方题解)

#505E Codeforces官方题解

 

可以发现如果每天对这个竹子的操作相同的话,要想让最后的这个竹子的高度和倒着推的高度一样,之前每天正着推的高度都必须小于等于倒着推的高度。

首先计算从MAXi开始,最多经历多少天自由生长(减少高度a[i]),竹子的高度变为负数,然后用一个小顶堆维护竹子变为负数的天数(时间越小,越快变为负数),每天取k个竹子进行砍伐(拔高处理)。若存在某一天来不及拔高竹子(存在某个竹子的高度在这一天之前就变为0了),就可以立刻判定m天后不能可以让每个竹子高度均大于等于h[i]。

现在我们让所有竹子倒过来生长,最终每个竹子高度均大于等于0后,就需要让每个竹子的高度拔高,使得它们最终高度大于等于h[i],显然此时由于在生长过程中,每个竹子在任意时刻高度均大于等于0,故此时补充的操作无论是在何时发生都是一样的。这时直接通过数学方法,计算每个竹子和h[i]之间相差的高度以考虑需要补上多少次操作就够了。

这道题是看着题解跪着做完的Orz,感觉对二分的理解更深了一些,二分处理的都是判定性问题,不能直接求值。

代码如下:

1 #include
2 #include
3 #include
4 #define N 100000 5 #define LL long long 6 #define mid ((l+r)>>1) 7 using namespace std; 8 const LL MAX=1e15; 9 LL n,m,k,p,l,r;10 LL h[N+5],a[N+5];11 LL now[N+5];12 typedef pair
P;13 struct cmp{14 bool operator()(P a,P b){15 return a.first>b.first;//小顶堆16 }17 };18 bool judge(LL x){19 priority_queue

,cmp> q;20 for(LL i=0;i

=0)continue;//不需要补充高度23 q.push(make_pair(x/a[i],i));//P(到零的天数,下标)24 }25 LL times=0;//砍伐次数26 for(;times<=k*m;times++){27 if(q.empty())break;28 P temp=q.top();29 q.pop();30 if(temp.first<=times/k)return 0;//来不及补充高度,竹子在k天前就长成负数31 LL index=temp.second;32 now[index]+=p;33 if(now[index]-m*a[index]>=0)continue;//不需要补充高度34 q.push(make_pair(now[index]/a[index],index));35 }36 if(times>k*m)return 0;37 for(int i=0;i
k*m)return 0;42 }43 return 1;44 }45 int main(void){46 scanf("%I64d%I64d%I64d%I64d",&n,&m,&k,&p);47 l=1,r=MAX;48 for(LL i=0;i

 

转载于:https://www.cnblogs.com/barrier/p/5783897.html

你可能感兴趣的文章
Velocity官方指南-容器
查看>>
国家为何如此重视石墨烯?
查看>>
《Python和Pygame游戏开发指南》——1.14 配套网站上的更多信息
查看>>
Kafka+Flink 实现准实时异常检测系统
查看>>
利用mybatis查询两级树形菜单
查看>>
《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 <一>
查看>>
Spring声明式事务管理之二:核心接口API
查看>>
LNMP环境安装(二)
查看>>
MFC对话框编程-图片控件
查看>>
nodejs启动webserver服务
查看>>
小偷被抓叫嚣:我不偷警察没饭吃
查看>>
python初学—-实现excel里面读数据进行排序
查看>>
用户体验升级后 “谁行谁上”让百度Q4财报更有底气
查看>>
直播相关学习链接
查看>>
使用RPM包工具和源码包编译安装Linux应用程序
查看>>
VoIP——开启免费通话新时代的先锋
查看>>
Linux下rsync的用法
查看>>
apache虚拟主机、日志轮询、日志统计、去版本优化
查看>>
java代码实现开启openoffice服务和关闭sffice.exe进程
查看>>
docker镜像的使用方法
查看>>