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)的。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号