思路:每回找出在龙头下接水所需最小的接水量,将所有在接水的减去这个最小接水量,再加入一个新的同学开始接水,重复此过程。当后面没人时,最后加上最大接水量所需时间即可。
例一:
步骤一. 4 4 1 ··· 排序后 1 4 4 ···减去后 0 3 3 ···重新加入后 2 3 3
步骤二. 2 3 3 ··· 排序后 2 3 3 ···减去后 0 1 1 ···重新加入后 1 1 1
步骤三. 1 1 1 ··· 排序后 1 1 1 ···减去后 0 0 0
#include <iostream>
using namespace std;
#include <algorithm>
int main()
{
int n, m, i, j, t = 0, e;
int a[10005], b[105];//a->每个人接水量,b->龙头对应每个人的接水量
cin >> n >> m;
for (i = 0 ; i < n ; i++)
{
cin >> a[i];
}
for (i = 0 ; i < m ; i++)
{
b[i] = a[i];//将m个人的龙头分别放在对应的龙头下面
}
for (i = m ; i < n ; i++)
{
sort(b, b + m); //求出能接完一桶对应的最少的放水量
e = b[0];//对每个龙头所需放水最少就能接完其中一桶的量
for (j = 0 ; j < m ; j++)
{
b[j] -= e;//所有的水桶减去能接满最少一桶水的量
}
t += e;//加上所需时间
b[0] = a[i];//将另外一桶水加入进来,继续放水
}
sort(b, b + m);
t += b[m - 1];
cout << t;
return 0;
}