算法:模拟
复杂度:
解题思路:
从前往后依次考虑队列中的每个同学,每个同学会去当前结束时间最早的水龙头处接水。
由于本题数据范围较小,因此可以直接循环一遍所有水龙头,求出当前结束时间最早的水龙头编号。那么我们就将当前同学安排在这个水龙头的位置上,然后将该水龙头的结束时间加上当前同学的接水时间。
最后,所有水龙头结束时间的最大值就是答案。
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; }