[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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构