有n个人排队到r个水龙头去打水,他们装满水桶的时间t1,t2,…,tn为整
数且各不相等,应如何安排打水顺序才能使他们总共花费的时间最少?
Input
第一行n,r(n≤500,r≤75)
第二行为n个人打水所用的时间ti(ti≤100)
Output
最少的花费时间
Sample Input
32
123
Sample Output
7
若输入为
7 3
14 4 16 6 5 3
结果是[填空1]
这个问题可以使用贪心算法来解决。以下是解题的思路:
首先,我们需要将每个人的打水时间按照从小到大排序,这样可以保证先分配给打水时间短的人,尽早完成打水任务。
接下来,我们初始化一个长度为r的数组pipes,用于记录每个水龙头的当前打水时间。
我们遍历排序后的打水时间数组,依次将每个人分配到一个水龙头上。
对于每个人,我们选择当前打水时间最短的水龙头(即当前打水时间最少的水龙头),将其打水时间加上该人的打水时间,并更新该水龙头的打水时间。
最后,我们遍历所有水龙头的打水时间,找到最长的打水时间,即为最少的花费时间。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include <vector>
using namespace std;
int main() {
int n, r;
cin >> n >> r;
vector<int> times(n);
for (int i = 0; i < n; i++) {
cin >> times[i];
}
sort(times.begin(), times.end()); // 将打水时间按照从小到大排序
vector<int> pipes(r, 0); // 记录每个水龙头的当前打水时间
for (int i = 0; i < n; i++) {
int minTime = INT_MAX;
int minPipe = -1;
// 找到当前打水时间最少的水龙头
for (int j = 0; j < r; j++) {
if (pipes[j] < minTime) {
minTime = pipes[j];
minPipe = j;
}
}
// 将当前人的打水时间加到最少时间的水龙头上,并更新该水龙头的打水时间
pipes[minPipe] += times[i];
}
int maxTime = 0;
for (int i = 0; i < r; i++) {
maxTime = max(maxTime, pipes[i]);
}
cout << maxTime << endl;
return 0;
}