如何解决在“耐力”约束下安排活动和休息
我正在尝试创建一个算法来解决一个问题(为了简化),您必须完成 n 个不同的活动,并且只能在 min_start[i] 时间之后开始活动 i,因为 i 从 0 到 (n-1 )。每个活动需要 t 分钟才能完成,但您有一个限制,即您只能在休息前完成 s 个活动(而休息需要 b 分钟)。您可以在活动或休息期间之间留出任意数量的空间,但需要明确规定的“休息时间”为 b 分钟以重置耐力计数器 s。目标是找到活动时间表和休息开始时间,以尽快完成所有活动。
有没有 O(n) 算法来解决这个问题?我尝试了贪心算法,但提出了以下两个贪心算法似乎失败的例子。我认为这可能可以通过动态规划解决,但我无法弄清楚如何在每一步制作一个大小为 O(n) 且时间为 O(1) 的表(似乎您需要一个额外的维度)。>
示例 1:
- b=2,t=1,s=3,n=5,min_start=(0,2,3,4,6)
- 最优解:(act0@0,act1@2,act3@3,break@4,act4@6,act5@7)
- 最佳完成时间 = 8
示例 2:
- b=2,s=4,5)
- 最优解:(act0@0,break@1,act2@3,act3@4,act4@5,act5@6)
- 最佳完成时间 = 7
我相信一个有趣的策略可能是从列表的后面开始,并在最后 (s+1) 个讲座中选择最佳休息地点。然后你可以“切断”休息时间和它之后的所有讲座,你有一个更小的子问题。我只是不确定如何在线性时间内完成,除非可以在恒定时间内计算最后(s + 1)次讲座中最后一次休息的最佳位置,或者可能有某种摊销分析可能导致到 O(n) 的总时间,而在这些步骤中的每一步都没有 O(1) 的时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。