描述
有一个顾客服务系统, 可以每次从队伍的最前面三个人中选两个来同时服务. (剩下的那个人成为后面队伍中的第一个人). 被选中的那两个人的服务时间以更长的那个为准. (服务同时开始, 同时结束). 如何安排服务顺序, 使得总的服务时间最短?
输入: 服务每个顾客的所需时长costs
, costs[i]
表示第i
个顾客需要被服务的时长.
输出: 最短时间和服务方案. (如果总时间有并列, 优先服务编号小的).
思路
和lc-1187很像, 我们用一个pre
表示上一轮剩下的那个人的编号. dfs+memo. (除结束点以外)每个点有三个分支: 剩下第一(pre
)个人or第二个人or第三个人. 然后返回时间最小的分支.
本题还要输出方案, 那么用一个next
字典记录最优的状态(i, pre)
转移. memo
数组同时记录最优时间和对应的本轮选择方案. 如果三个分支有并列, 优先选出现早的.
代码
1 | def do(): |