题目大意
你有一个大小为L的容器,每天早上都会有一个已知温度,已知体积的水到容器里面,但是这个容器是会爆的,为了不让他爆,每一天的晚上你都可以放一些水,求第n天时,在容器满容量的前提下,可以达到的最高温度是多少(每一天给你的水必须照单全收)
温度变化的公式
t1∗v1+t2∗v2v1+v2
t
1
∗
v
1
+
t
2
∗
v
2
v
1
+
v
2
题解
观察一下这个温度的式子,是对称的,也就是说如果每一天的温度是递增的话,我肯定每天晚上全部漏完只取最后L天
但是有一个十分关键的问题
就是某一天温度突然降了下来,但我们必须要收下这一单,这时候就有了是要更多的水稍微第一点的温度还是要少一点的水高一点温度的困难决策,因为我们不知道后面还会有什么古灵精怪的温度和水量
考虑到某一天的水是依赖着前面的水的,也就是说如果你要前面的就不可避免的要收下后面的水
参考前面的特殊情况(水的温度是递增的),题解给出了一种很6的做法
保存一个总容量为L的单调队列,表示我们当前准备选择的水,先不把它们混合起来,因为很有可能是要剔除掉一些前面的水的,而这样子存储给了我们修改的空间
每一次加进来新的水,单调队列中最前面对应体积的水就要去掉,如果当前的新水是最热的那么就直接加上去,否则就不断和队列的末尾混合,直到变成整个队列最热的
可以发现这样做在本质上就是贪心的减小着我们的损失,因为你这一单无论是好是坏都是要收的,那么我们就舍去最无用的就好了,并且这样的话舍去不会有障碍