排队打水问题

问题描述:

有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?

输入说明:

        第一行n,r (n<=500,r<=75)
  第二行为n个人打水所用的时间Ti (Ti<=100);

输出说明:

最少的花费时间

范例演示:

        输入:3 2
                   1 2 3

        输出:7

解题思路:

        每个水龙头都要排人,而每个水龙头排的第n个人的等待时间就是该水龙头前面n-1个人打水时间总和,而该人打水所用时间就是他的等待时间加上他打水的时间,每个人都是这样,而每个人的用时加起来就是总用时。让总用时最少就要让每个人的时间最少,而每个人打水时间不会变,那么就要让每个人等待时间最少,那就要求排在这个人前面的人的打水时间要比他少。

代码如下:

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
    int n,r,sum=0;
    cin>>n>>
编号1228的排队打水问题在给定引用中未明确提及,但可以参考相似的排队打水问题信息。问题详情通常为有n个同学在r个水龙头打水,每个人的接水时间是ti,需要找出一种排队次序,使得所有人打水时间最少。输入包含两行,第1行是人数n和窗口数r,用空格隔开;第2行是n个数,表示每个人打水需要的时间ti,用空格隔开[^1]。 该问题的解决方案采用贪心思想,先对所有的打水时间进行排序,让打水时间少的人先打水,这样后面的人等待时间就会减少。可以使用如下C++代码实现: ```cpp #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N = 1100; int t[N]; //每一个人打水所需时间 int waite[N]; //存放的是每一个人需要等的时间 int n, m; //n个人,m个水龙头 int main() { cin >> n >> m; for (int i = 0; i < n; i++) cin >> t[i]; sort(t, t + n); //先排序 int ans = 0; // 最小的等待时间之和 for (int i = 0; i < n; i++) { if (i < m) //前m个人需要等待的,直接就可以打水了,因此等待时间为0 { waite[i] = 0; } else { //你的等待时间=前面一个人的等待时间+前面一个人打水时间 //减m是因为要分配到m个水龙头上 waite[i] = waite[i - m] + t[i - m]; } } for (int i = 0; i < n; i++) { ans += t[i] + waite[i]; } cout << ans << endl; return 0; } ``` 此代码通过对打水时间排序,计算每个人的等待时间,最后累加每个人打水时间和等待时间得到总时间,从而得到所有人打水的最小总时间[^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Merran_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值