洛谷P1190 接水问题

本文解析了洛谷P1190接水问题,强调审题重要性,通过模拟算法解决学生接水顺序问题,确保每位同学在规定时间内完成接水。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目名称:接水问题
题目来源

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值