洛谷P1190 接水问题
题目名称:接水问题
题目来源
[洛谷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
I can do all things