【算法百题之二十三】游泳池—研发
大家好,我是Lampard~~
很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!
今天的问题是:
在开始时,给水管和排水管都是打开状态的,并且游泳池里没有水。在自动装置的作用下,每经过t1分钟,给水管的状态都会改变,即从打开状态变为关闭状态或从关闭状态变为打开状态,而同时每经过t2分钟,排水管的状态也会改变。当给水管打开时,给水管每分钟会向游泳池里注入m1升水;当排水管打开时,排水管每分钟会把游泳池里水排走m2升;当给水管和排水管同时打开时,游泳池的水量变化为每分钟(m1-m2)升。当然泳池的水量不能变为负数,同时泳池也有个最大容量m,水量不能超过m升。那么经过t分钟后,游泳池里有多少升水?
放水又排水,梦回小学有木有???
思路:
首先依题意得,我们知道每过2*t1时间为一个进水周期,进入了m1升水。同理,2*t2是一个排水周期,排出了m2升水。
那么我们第一步:首先应应该计算出在时间t内有多少个排水周期和进水周期。
int NumT1, NumT2; // NumT1和NumT2是进水和排水的周期数
NumT1 = t / (t1 * 2);
NumT2 = t / (t2 * 2);
在计算完周期之后,我们还要考虑余下的时间,进行分类讨论:如果余下的时间大于等于半个进水周期,则进水量要加上一个m,如果不足半个周期(一个t1),则按时间比例*m1增加水量.,排水同理。
double NumIn, NumOut; // NumIn是进水量,NumOut是排水量
if (t % (t1 * 2) <= t1)
// 第一种情况是余数小于t1,所以余数的进水量是余数*m1
NumIn = NumT1 * m1 * t1 + t % (t1 * 2)*m1;
else if (t % (t1 * 2) > t1)
// 第二种情况是余数大于t1,那么就是倒入了m1*t1
NumIn = NumT1 * m1*t1 + m1 * t1;
if (t % (t2 * 2) <= t2)
// 第一种情况是余数小于t2,所以余数的排水量是余数*m2
NumOut = NumT2 * m2 * t2 + t % (t2 * 2)*m2;
else if (t % (t2 * 2) > t2)
// 第二种情况是余数大于t2,那么就是倒入了m2*t2
NumOut = NumT2 * m2*t2 + m2 * t2;
然后分类讨论进水量与排水量之间的关系就可以了。结果: