1. 解题思路
这一题思路上算是一个宽度优先遍历吧,我们就是不断地考察当前情况下的用时最少运输方法,以及其后续可能的运输方法,直至第一次将所有人都送到对岸。
不过具体做法上容易踩坑,就是没考虑好情况的话就容易出错,反正我这次错了好多次,最后倒是改对了,但是思路上其实和一开始做的也没啥变化,就是写法上不断优化,这里就不展开了,对着代码看看反正还挺好懂的。
2. 代码实现
给出python代码实现如下:
class Solution:
def minTime(self, n: int, k: int, m: int, time: List[int], mul: List[float]) -> float:
if k == 1:
return -1 if n >= 2 else time[0] * mul[0]
q = [(0, 0, 0, 0)] # (time, status, stage, edge)
seen = set()
while q:
t, status, stage, edge = heapq.heappop(q)
if status == 2**n-1:
return t
elif (status, stage, edge) in seen:
continue
seen.add((status, stage, edge))
if edge == 0:
candidates = [i for i in range(n) if status & (1<<i) == 0]
for kn in range(min(k, len(candidates)), 0, -1):
for group in combinations(candidates, kn):
t_go = max([time[i] for i in group]) * mul[stage]
updated_status = 0
for i in group:
updated_status |= (1<<i)
new_status = status | updated_status
new_stage = (stage + int(t_go)) % m
if (new_status, new_stage, 1) not in seen:
heapq.heappush(q, (t+t_go, new_status, new_stage, 1))
else:
reached = [i for i in range(n) if status & (1<<i) != 0]
for i in reached:
t_back = time[i] * mul[stage]
new_status = status - (1<<i)
new_stage = (stage + int(t_back)) % m
if (new_status, new_stage, 0) not in seen:
heapq.heappush(q, (t+t_back, new_status, new_stage, 0))
return -1
提交代码评测得到:耗时8815ms,占用内存135.42MB。