CF1461E Water Level

感觉这个题目挺有趣的。

如果秉持懒惰的原则,不到必须添加水的那一刻绝不添加水,会怎么样?

如果接下来的一天开始前不添加水,水就会被用穿到L以下,那么就必须添加水。

感觉需要讨论x,y的大小

如果y>x,那么一天的增加量就足以抵消一天的消耗量,我们的顾虑反倒是对R的突破。

因此在不得不添加水的时候添加水,把突破R的可能性降到最小。

所以按照这个过程模拟下去,如果始终保持在[L,R]范围内则YES否则NO

t太大,不能直接模拟。

 

首先不加水,每天都-x,直到剩下k%x为止,这天早上就得加水y,我们暂且不考虑对R的突破,那么晚上再减少x,一天下来等价于加了d=y-x

这样不断加d,直到水量>=x后,暂停加水,重复之前的过程。

关键在于,这有什么公式吗?感觉我的问题问得奇怪,如果不考虑R的突破的话,这样的算法一定会给出YES。

那么就得看这样的过程中,R是否会被突破,如果不会被突破,那么就YES,如果会被突破,还得证明别的加水方案也一定NO,因此输出NO

感觉每一次从开始加水到暂停加水的轮回中,基底水量好像不太确定。

也不太确定一个轮回要持续多少天,每个轮回都不一样的。

数列倒是等差数列。

 

可以把一个轮回用max区分成两个阶段,计算每个阶段的天数以及起点终点。

但是这样很烦人,我不愿意这样想。

 

看了stream,感觉就是模拟+优化,优化基于一个观察,也就是迭代次数不会超过x次,而x<=10^6。

 每次基底水量一定是<x的,而如果之前就访问过同样的基底水量,我们就开始循环,于是一定可以撑过t天,所以我们最多只会访问x种不同的基底水量。算法是O(X)的。

posted @ 2021-03-07 20:44  AngelKnows  阅读(56)  评论(0)    收藏  举报