学校里有一个水房,水房里一共装有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);
}