算法
(模拟) $O(nm)$
从前往后依次考虑队列中的每个同学,每个同学会去当前结束时间最早的水龙头处接水。
由于本题数据范围较小,因此可以直接循环一遍所有水龙头,求出当前结束时间最早的水龙头编号。那么我们就将当前同学安排在这个水龙头的位置上,然后将该水龙头的结束时间加上当前同学的接水时间。
最后,所有水龙头结束时间的最大值就是答案。
时间复杂度
一共枚举 $n$ 个同学,对于每个同学都需要枚举一遍 $m$ 个水龙头,因此总时间复杂度是 $O(nm)$。
C++ 代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010, M = 110;
int n, m;
int w[N];
int q[M];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++ ) scanf("%d", &w[i]);
for (int i = 0; i < n; i ++ )
{
int t = 0;
for (int j = 0; j < m; j ++ )
if (q[j] < q[t])
t = j;
q[t] += w[i];
}
int res = 0;
for (int i = 0; i < m; i ++ ) res = max(res, q[i]);
cout << res << endl;
return 0;
}
哈哈哈大学java作业