问题描述
马路边有一个共享厕所,厕所里一共装有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
输出范例
4
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; }