LCP 20. 快速公交 Python@TOC
LCP 20. 快速公交 Python
题目内容
解题思路
代码
题目内容
小扣打算去秋日市集,由于游客较多,小扣的移动速度受到了人流影响:
小扣从 x 号站点移动至 x + 1 号站点需要花费的时间为 inc;
小扣从 x 号站点移动至 x - 1 号站点需要花费的时间为 dec。
现有 m 辆公交车,编号为 0 到 m-1。小扣也可以通过搭乘编号为 i 的公交车,
从 x 号站点移动至 jump[i]*x 号站点,耗时仅为 cost[i]。小扣可以搭乘任意编号
的公交车且搭乘公交次数不限。
假定小扣起始站点记作 0,秋日市集站点记作 target,请返回小扣抵达秋日市集最少需要
花费多少时间。由于数字较大,最终答案需要对 1000000007 (1e9 + 7) 取模。
注意:小扣可在移动过程中到达编号大于 target 的站点。
示例 1:
输入:target = 31, inc = 5, dec = 3, jump = [6], cost = [10]
输出:33
解释:
小扣步行至 1 号站点,花费时间为 5;
小扣从 1 号站台搭乘 0 号公交至 6 * 1 = 6 站台,花费时间为 10;
小扣从 6 号站台步行至 5 号站台,花费时间为 3;
小扣从 5 号站台搭乘 0 号公交至 6 * 5 = 30 站台,花费时间为 10;
小扣从 30 号站台步行至 31 号站台,花费时间为 5;
最终小扣花费总时间为 33。
示例 2:
输入:target = 612, inc = 4, dec = 5, jump = [3,6,8,11,5,10,4], cost = [4,7,6,3,7,6,4]
输出:26
解释:
小扣步行至 1 号站点,花费时间为 4;
小扣从 1 号站台搭乘 0 号公交至 3 * 1 = 3 站台,花费时间为 4;
小扣从 3 号站台搭乘 3 号公交至 11 * 3 = 33 站台,花费时间为 3;
小扣从 33 号站台步行至 34 站台,花费时间为 4;
小扣从 34 号站台搭乘 0 号公交至 3 * 34 = 102 站台,花费时间为 4;
小扣从 102 号站台搭乘 1 号公交至 6 * 102 = 612 站台,花费时间为 7;
最终小扣花费总时间为 26。
提示:
1 <= target <= 10^9
1 <= jump.length, cost.length <= 10
2 <= jump[i] <= 10^6
1 <= inc, dec, cost[i] <= 10^6
解题思路
首先先读懂题目的几个要素:
1.站点信息 0-target, 从0到达target站点,可以超过target后再返回.目标就是要从0到target
2.时间消耗:走路 前进一个站点 inc, 后退一个站点 dec
坐车 cost[i]
3.移动的方式:走路
坐车 jump列表 cost列表
坐车每次移动的距离: x --> jump[i]*x i车次
坐车消耗的时间: cost[i]
把题目理清后,我们发现这是树状结构的问题
需要找到最短路径 而且我们在树上的每个节点需要做的是相同的事情
所以可以用递归的思路解决
假设从第0站到target站 我们需要走N步:
1,2,3,4…N
我们不知道到底要走多少步 每一步是坐车还是走路
那就假设我们在第m步,就是中间的任意一步
当我们在第m步的时候怎么办
我们有两个选择 走路 做车
坐车 又分成两种情况 一种是超过target站点,一种是不超过target站点
在每个节点遍历三种情况,把剩余路程传到下一个节点
直到走到target站点,返回结束 返回
递归的尽头就是最后一步, 也就是从0到target的过程结束了
所以min函数比较的就是最后的结果,返回的就是最小值
代码
class Solution(object):
def busRapidTransit(self, target, inc, dec, jump, cost):
"""
:type target: int
:type inc: int
:type dec: int
:type jump: List[int]
:type cost: List[int]
:rtype: int
"""
route_dic = {}
def deep(x):
if x in route_dic.keys():
return route_dic.get(x)
route_dic[x] = 1e18
res = x * inc
for i in range(0, len(jump)):
if jump[i] == 1:
continue
n = int(x / jump[i]) * jump[i]
res = min(res, deep(int(n / jump[i])) + cost[i] + (x - n) * inc)
b = int(x / jump[i] + 1) * jump[i]
res = min(res, deep(b / jump[i]) + cost[i] + (b - x) * dec)
route_dic[x] = res
return res
res = deep(target)
return int(res % (1e9 + 7))