题目描述
酒馆里有m个龙头可供顾客们接啤酒,每个龙头每秒的出酒量相等,都是1。现有n名顾客准备接酒,他们初始的接酒顺序已经确定。将这些顾客按接酒顺序从1到n编号,i号顾客的接酒量为w_i。接酒开始时,1到m号顾客各占一个酒龙头,并同时打开龙头接酒。当其中某个顾客j完成其接酒量要求wj后,下一名排队等候接酒的顾客k马上接替j顾客的位置开始接酒。这个换人的过程是瞬间完成的,且没有任何酒的浪费。即j顾客第x秒结束时完成接酒,则k顾客第x+1秒立刻开始接酒。若当前接酒人数n’不足m,则只有n’个龙头供酒,其它m-n’个龙头关闭。现在给出n名顾客的接酒量,按照上述规则,问所有顾客都接完酒需要多少秒?
输入描述:
输入包括两行,第一行为以空格分割的两个数n和m,分别表示接酒的人数和酒龙头个数,均为正整数。
第二行n个整数w_i(1 <= w_i <= 100)表示每个顾客接酒量输出描述:
如果输入合法输出酒所需总时间(秒)。
注意:最终交付的函数代码中不要向控制台打印输出任何无关信息。
示例1
输入
5 3
4 4 1 2 1
输出
4
不知道有没有问题,欢迎指正
#include<iostream>
#include<vector>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int n, m; //接酒的人数和水龙头数,水龙头出酒速度为1
while (cin >> n >> m)
{
vector<int>cap(n);
int temp;
for (int i = 0; i < n; i++)
{
cin >> temp;
cap[i] = temp; //记录酒量
}
sort(cap.begin(), cap.end(),cmp); //顺序无所谓可以直接排序,这里从大到小
if (n <= m) //如果喝酒的人数少于水龙头数量
{
cout << cap.front() << endl;
break;
}
vector<int>lo(cap.begin(),cap.begin()+m);
sort(lo.begin(), lo.end());
for (int i = m; i < n; i++)
{
lo[0] += cap[i];
sort(lo.begin(), lo.end());
}
sort(lo.begin(), lo.end());
cout << lo.back() << endl;
}
return 0;
}