/***********************************************************************
* 华为笔试:酒馆里有m个龙头可供顾客们接啤酒,每个龙头每秒的出酒量都是1,
* 现有n名顾客准备接酒,他们初始的接酒顺序已经确定。将这些顾客按接酒顺序
* 从1-n编号,i号顾客的接酒量为w_i。接酒开始时,1到m号顾客各占一个酒龙
* 头,并同时打开龙头接酒。当其中某个顾客完成其接酒量要求后,下一名排队
* 等候接酒的顾客马上接替他。给出n名顾客的接酒量,按上述规则,所有顾客都
* 接完酒需要多少秒?
************************************************************************/
#include <iostream>
#include<vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
int m;
cin >> n;
cin >> m;
vector<int> w(n);
for (int i = 0; i < n; i++)
{
cin >> w[i];
}
vector<int> time(m);
for (int i = 0; i < m; i++)
time[i] = w[i];
for (int i = m; i < n; i++)
{
sort(time.begin(), time.begin()+m);
time[0] += w[i];
}
sort(time.begin(), time.begin()+m);
cout << time[m-1] << endl;
return 0;
}
改进1:上述解法中的time数组其实可以不需要,直接用w数组的前m个就可以。
改进2:循环中的排序是没有必要的,只要求取最小的数就可以,而不关心顺序。
改进3:既然只关心最小值,那么可以实现一个最小堆,每次取最小值的时间复杂度就是O(1).更新最小堆的时间复杂度是O(logm).