贪心算法——1233:接水问题

1233:接水问题

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 7717     通过数: 4074
【题目描述】
学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的
供水量相等,均为1。

现在有n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1
到n编号,i号同学的接水量为wi。接水开始时,1到m号同学各占一个水龙头,并同时
打开水龙头接水。当其中某名同学j完成其接水量要求wj后,下一名排队等候接水的
同学k马上接替j同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水
的浪费。即j同学第x秒结束时完成接水,则k同学第x+1 秒立刻开始接水。 若当前接
水人数n’不足m,则只有n’个龙头供水,其它m-n’个龙头关闭。

现在给出n名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

【输入】
第12个整数n和m,用一个空格隔开,分别表示接水人数和龙头个数。

第2 行n个整数 w1、w2、……、wn,每两个整数之间用一个空格隔开,wi表示 i 号同学的接水量。

【输出】
输出只有一行,1个整数,表示接水所需的总时间。

【输入样例】
5 3
4 4 1 2 1
【输出样例】
4
【提示】
样例输入#28 4

23 71 87 32 
### 使用贪心算法解决混合流水车间调度问题 #### 方法概述 混合流水车间调度问题是生产计划领域的一个重要课题,其目标是在多个机器上安排一系列作业以最小化某些性能指标(如最大完成时间)。对于此类问题贪心算法提供了一种有效的方法来获得近似最优解。该方法的核心在于选择合适的贪婪策略,在每一步决策中追求当前最佳选项。 #### 示例说明 考虑一个简化版的混合流水车间调度实例,其中存在两个加工阶段(即两台不同类型的机床),以及五个待处理的工作件。为了便于理解,假设这些工作件在每个阶段所需的加工时间为已知常数,并且所有工作件都必须依次经过这两个阶段才能被认为已完成。 #### Johnson贪心算法的应用 Johnson贪心算法是一种经典的用于求解双机流水线排程问题的有效算法。此算法能够快速找到使整个流程最短的日程表。具体步骤如下: 1. 将所有的工件依据它们在第一台设备上的预计运时长$a[i]$与第二台设备上的$b[i]$作比较; 2. 如果$a[i]\leq b[i]$则放入集合$N_1$;反之,则加入到另一个集合$N_2$里去; 3. 接下来分别对上述两个子集内的元素按照各自对应的条件升序排列——前者基于$a[i]$从小至大排序,后者则是根据$b[i]$降序整理; 4. 组合起来形成最终序列:先是按正向遍历过一遍来自$N_1$里的成员,接着逆着读取自$N_2$出来的那些项[^4]。 ```python def johnson_greedy_algorithm(jobs): n1, n2 = [], [] # Step 1 & 2: Split jobs into two lists based on processing times. for i in range(len(jobs)): a_i, b_i = jobs[i][0], jobs[i][1] if a_i <= b_i: n1.append((a_i, b_i)) else: n2.append((a_i, b_i)) # Step 3: Sort the first list by increasing order of ai and second one by decreasing bi. sorted_n1 = sorted(n1, key=lambda x: x[0]) sorted_n2 = sorted(n2, key=lambda x: -x[1]) # Combine results from both parts to get final schedule sequence. result_schedule = [(job[0], job[1]) for job in (sorted_n1 + sorted_n2[::-1])] return result_schedule if __name__ == "__main__": example_jobs = [ (3, 5), # Job with time requirements at M1=3 units and M2=5 units (8, 7), (6, 9), (4, 2), (5, 6) ] optimal_sequence = johnson_greedy_algorithm(example_jobs) print("Optimal Sequence:", optimal_sequence) ``` 这段Python代码实现了约翰逊法则下的贪心算法逻辑,它接收一组形如$(a,b)$的数据作为输入参数,代表各工序所需的时间长度,输出的是优化后的任务执次序列表。 #### 结果解释 当给定特定的一组数据点时,程序将会返回一条理想的路径指示我们应该怎样分配资源使得总的完工时刻尽可能早到来。然而值得注意的是,尽管这种方法通常能给出相当不错的解答,但在面对更复杂的实际应用场景时仍可能存在局限性,因为真正的工业环境中还存在着诸如前置准备活动、并操作可能性等因素的影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值