洛谷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

原文地址:https://www.cnblogs.com/juruohqk/p/11040262.html