Problem 1197 # 共享厕所

问题描述

 
 

        马路边有一个共享厕所,厕所里一共装有m 个马桶可供人们拉尿,每个人每秒钟的拉尿量相等,均为1。 现在有n 个人准备拉尿,他们的初始拉尿顺序已经确定。将这些人按拉尿顺序从1 到n编号,i 号同学的拉尿量为ai。拉尿开始时,1 到m 号人各占一个马桶,并同时开始拉尿。当其中某个人j 完成其拉尿量要求aj 后,下一名排队等候拉尿的人x马上接替j人的位置开始拉尿。这个换人的过程是瞬间完成的。即第j人第k秒结束时完成拉尿,则第x人第k+1 秒立刻开始拉尿。若当前拉尿人数n’不足m, 则只有n’个马桶供使用,其它m-n’个马桶关闭。 现在给出n 名人的拉尿量,按照上述拉尿规则,问所有人都拉完尿需要多少秒。

输入

 
 

第1 行是n 和m,分别表示拉尿人数和马桶个数。

第2 行n 个整数a1、a2、……、an,ai 表示i 号同 学的拉尿量。

输出

 
 

输出结果表示拉尿所需的总时间,结果只占一行。

输入范例

 
 

5 3  

4 4 1 2 1 

8 4  

23 71 87 32 70 93 80 76 

输出范例

 
 

163  


Hint

对于第一个样例:

第1 秒,3 人拉尿。第1 秒结束时,1、2、3 号人每人的已拉尿量为1,3 号人拉完尿,4 号人接替3 号人开始拉尿。  

第2 秒,3 人拉尿。第2 秒结束时,1、2 号人每人的已拉尿量为2,4 号人的已拉尿量为1。  

第3 秒,3 人拉尿。第3 秒结束时,1、2 号人每人的已拉尿量为3,4 号人的已拉尿量为2。4 号人拉完尿,5 号人接替4 号人开始拉尿。  

第4 秒,3 人拉尿。第4 秒结束时,1、2 号人每人的已拉尿量为4,5 号人的已拉尿量为1。1、2、5 号人拉完尿,即所有人完成拉尿。  

总拉尿时间为4 秒。

每遍历一次挑时间最短的填数,填完之后所用时间最长的厕所就是所求的时间

AC代码

#include<stdio.h>
#include<string.h>
#define MAX 500000
int a[MAX];
int m;
int n;
int time;
int find(int b)
{
    int min;
    int i;
    for(i=1,min=0;i<m;i++){
        if(a[min]>a[i]){
            min=i;
        }
    }
    return min;
}
int main()
{
    int i;
    int j;
    int c;
    int min;
    while(scanf("%d %d",&n,&m)!=EOF){
        a[0]=0;
        if(n>m){
            for(i=0;i<m;i++){
                scanf("%d",&a[i]);
            }
            for(j=0;j<n-m;j++){
                scanf("%d",&c);
                min=find(c);
                a[min]=a[min]+c;
            }
            for(i=1,time=a[0];i<m;i++){
                if(a[i]>time){
                    time=a[i];
                }
            }
        }
        else{
            for(i=0;i<n;i++){
                scanf("%d",&a[i]);
            }
            for(i=1,time=a[0];i<n;i++){
                if(a[i]>time){
                    time=a[i];
                }
            }
        }
        printf("%d\n",time);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sifangege/article/details/80356548
今日推荐