题目名称:接水问题
题目来源
[洛谷P1190] (https://www.luogu.org/problemnew/show/P1190)
题目描述
学校里有一个水房,水房里一共有(m)个龙头供学生们打开水,每个水龙头每秒的供水量相等,均为(1)
现在有(n)名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从(1)到(n)编号,(i)号同学的接水量为(w_i)。接水开始时,(1)到(m)号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学(j)完成其接水量要求(w_j)后,下一名排队等候接水的同学(k)马上接替(j)同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即(j)同学第(x)秒结束时完成接水,则(k)同学第(x+1)秒立刻开始接水。若当前接水人数(n)不足(m),则只有(n)个龙头供水,其它(m-n)个龙头关闭。
现在给出(n)名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
基本思路
正常人一看到题目,就会情不自禁的喊出:这不是傻*题吗???
然额,我却与很多小伙伴犯了同样的错误
题目中的话一定要仔细读,因为我就是没有看见“他们的初始接水顺序已经确定”这句活,导致考虑了半天的贪心思想,结果发现这是一道彻彻底底的模拟大水题!
多说无益,思路就用一句话描述吧:模拟(1-m)这(m)个水龙头,每次把所对应的接水时间减一来模拟接水的过程,同时需要的时间加一(剩下的都在代码里啦!
代码实现
#include<cstdio>
#include<iostream>
using namespace std;
int m,n;
int w[10010];//w[i]表示编号为i的同学所需的接水时间
int mi;//表示所需时间(分钟)
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&w[i]);
int now=m+1;//now表示若当前同学接完了水,下一个接水的同学的编号
while(now<=m+n)//now的值最大为m+n
{
for(int i=1;i<=m;++i)
{
w[i]--;
if(w[i]==0) {w[i]=w[now]; now++;}
}
mi++;
}
printf("%d",mi);
return 0;//最后别忘记加上"return 0;"
}
总结
对于这道题,我只想说,一定要审好题,不要漏掉题目中的关键信息,我已经因为这一点错过好多次了,希望能够早日养成仔细审题的好习惯!
还有,本蒟蒻从今往后就要下定决心学习MD啦,这是我第一篇用MD写的博客呦qwq