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

  • 相关阅读:
    分布式事务的四种解决方案
    uber-go/guide 的中文翻译
    域名解析-CNAME
    Nginx节点存活状态检查
    Laravel核心解读--中间件(Middleware)
    Mac dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
    前缀树算法实现路由匹配原理解析
    原创-实用salt部署文档(持续更新)
    线上案例-调参-设置滑动窗口提高视频云播放性能
    NGINX日志割切
  • 原文地址:https://www.cnblogs.com/juruohqk/p/11040262.html
Copyright © 2020-2023  润新知