【蓝桥杯】接水问题

这篇博客探讨了一个涉及水资源分配和调度的问题。在学校的水房里,有m个水龙头,n名学生按照预设顺序接水,每个学生需要特定的水量。当一个学生完成接水,下一名学生立即接替,确保无缝对接。文章详细描述了如何通过动态调整水龙头使用来优化整个接水过程,以减少总时间。通过示例输入和输出,展示了算法如何计算所有学生接完水所需的最短时间。
摘要由CSDN通过智能技术生成

学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的 供水量相等,均为1。 现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1 到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打 开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k 马上接替j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第x 秒结束时完成接水,则k 同学第x+1 秒立刻开始接水。若当前接水人数n’不足m, 则只有n’个龙头供水,其它m−n’个龙头关闭。 现在给出n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。输入格式  第1 行2 个整数n 和m,用一个空格隔开,分别表示接水人数和龙头个数。 第2 行n 个整数w1、w2、……、wn,每两个整数之间用一个空格隔开,wi 表示i 号同 学的接水量。
输出格式 
输出只有一行,1 个整数,表示接水所需的总时间。样例输入
5 3
4 4 1 2 1
样例输出
4
样例输入
8 4
23 71 87 32 70 93 80 76
样例输出
163

题目划重点:当接水的人刚结束时,排队的下一个未接水的上前接水。
当接水人数不足水龙头数,则只有接水人数个水龙头放水

思路:开始时有m个水龙头供水,当有一个人接水完成后,该人的水龙头停止接水。并且开辟一个新”水龙头“。每次有人接水完成后,就开辟一个新的"水龙头"给排队中的下一个人放水。

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int m=scanner.nextInt();
        int time=0,num=m;//因为我们的"水龙头时变化的,m是题目所给的数据,最好别直接修改,新开辟一个num来存储m(水龙头个数)
        int ok_num=0;
        int[] water=new int[n];
        for (int i = 0; i < n; i++) {
            water[i]=scanner.nextInt();
        }
        while (true){
            int counter=0;
            for (int j = 0; j < num; j++) {
                if (water[j]>0)
                    water[j]--;
//              前n个水龙头都接到了一毫升水
//              判断每个水龙头前的同学是否已经接完了,每次水龙头出水后,判断是否接完,接完就变成-1
//              此次刚好接完,下次m就需要往后移动一位
                if (water[j]==0){
                    water[j]=-1;//-1作为接水完成的标志
                    counter++;//每次如果有刚好接完的,那么下一次循环就新开辟一个水龙头
                    ok_num++;
                }
            }
            time++;
            num=num+counter;
            if (num>=n){//这里是题目可能出现的意外情况,即假如所有新开辟的水龙头个数加上原有水龙头个数大于人数,那么是肯定不合理的。
                num=n;
            }
//          如果全部都接完了结束
            if (ok_num==n){
                break;
            }
        }
        System.out.println(time);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣高不会写Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值