问题描述
有n个同学在r个水龙头打水,每个人的接水时间是ti,请你思考,能不能找出一种排队次序,使得所有人打水总时间最少
输入
共两行
第1行两个数,人数n,窗口数r,用空格隔开
第2行n个数,每个人看病需要的时间ti,用空格隔开
输出
所有人打完水所用的时间总和
分析
现在水龙人r个,那么为了使得总的打水时间最少,可以肯定的是,必须要让每一个水龙头都有同学打水才行,那么同样的道理,我们还是应该按照从小到大的顺序排序,然后每一个水龙头下面按照顺序安排一个同学,不能在第一轮打水的同学,按顺序排在每一个水龙头后面,使得每一个水龙头后面都有一个打水的序列,这样的方案才是最优的
1、按照打水时间从小到大排序
2、循环遍历,计算每一个同学的等待时间和打水时间
3、每一个水龙头进行一个求和(计算排在当前水龙头的打水总时间)
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 500 + 10
int a[MAXN];
int main()
{
int n, r, sum = 0;
scanf("%d %d", &n, &r);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
sort(a+1, a+1+n);
for(int i = 1; i <= n; i++)
{
int t = i;
while(t >= 0) {
//计算i同学的等待时间和打水时间,
//因为有r个水龙头因此排在他前面的那位是i-r
sum += a[t];
t -= r;
}
}
printf("%d\n", sum);
return 0;
}
这篇博客探讨了一个优化问题:如何安排n个同学在r个水龙头打水,使得总时间最短。通过分析,提出了将打水时间从小到大排序,并按顺序分配到每个水龙头的方法。程序实现中使用了排序和循环遍历,计算每个人的等待和打水时间,最终得出总时间。
744

被折叠的 条评论
为什么被折叠?



