题意
学校里有一个水房,水房里一共装有 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个整数,表示接水所需的总时间。
数据范围
1≤n≤10000,
1≤m≤100,m≤n,
1≤wi≤100
输入样例:
5 3
4 4 1 2 1
输出样例:
4
提示:以下是本篇文章正文内容,下面案例可供参考
代码如下(示例):
#include <iostream>
#include <cstdlib>
using namespace std;
int compare(const void* a, const void* b)
{ return (*(int*)b - *(int*)a); }
int main(){int n,m;cin>>n>>m;int k[n];for(int i=0;i<n;i++){cin>>k[i];}qsort(k,n,sizeof(1),compare);if(n<=m){cout<<k[0]<<endl;return 0;}int kk[m]={0};//记录每个水龙头承担的任务 for(int i=0;i<m;i++){kk[i]+=k[i];}int ii=m-1; //剩下的人在当前任务量最少的水龙头处排队int x=0; //标记下标该走向,0表示回退,1表示前进 int max=kk[0]; //当前任务量最多的是0号水龙头 for(int i=m;i<n;i++){kk[ii]+=k[i]; //给当前任务量最少的水龙头增加任务 if(max<=kk[ii]){max=kk[ii]; //更新当前任务量最大的水龙头; if(x==0){ii--;if(ii==-1){x=1;ii=0;}}else{ii++;if(ii==m){x=0;ii=m-1;}}}}qsort(kk,m,sizeof(1),compare);cout<<kk[0]<<endl;
}