[2010年NOIP普及组] 接水问题

大意:一共有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。 现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n编号,i 号同学的接水量为wi。接水开始时,1到m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求wj后,下一名排队等候接水的同学 k马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第 x 秒结束时完成接水,则 k 同学第 x+1 秒立刻开始接水。若当前接水人数 n’不足 m,则只有 n’个龙头供水,其它 m-n’个龙头关闭。 现在给出 n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

思路:用一个循环模拟m个水龙头一秒的接水量 (循环一次就是一秒),当然要到数组数组下标就是每个水龙头的标号 (1-m),那么数组的值就是对应的学生对应的接水量。刚开始时1-m个水龙头默认的对应1-m编号学生的接水量,一旦有一个学生接完了, 那么就让下一个等待接水的学生来这个水龙头接水,用代码实现的话就是让下个学生对应的接水值赋值这个这个水龙头对应的数组。

代码如下:

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int s[11000],ans;
int main()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>s[i];
int t=m+1;
while(t<=n+m)
{
for(int i=1;i<=m;i++)
{
s[i]--;
if(s[i]==0)
{
s[i]=s[t];
t++;
}
}
ans++;
}
cout<<ans;
return 0;
}