华为笔试题(高速路充电计划)[1维DP]

代码注释非常详细

张三购买了一辆续航里程数达到1000公里的自动驾驶车。

一天车电充满后,从甲城出发,前往距离d km的乙城。全程走高速。

沿途有n个休息站,可提供充电服,充电站提供了当前充电的排队时间。

高速上的行程速度固定为100公里每小时, 汽车可以将电全部用光。1000公里续航的汽车,如果按100公里每小时奔跑,可以跑十个小时

每次充电时间固定为一个小时【不考虑之前的剩余电量】,每次充电后电池充满,排队过程不耗电

输入格式

第一行是甲乙两地的距离d【0<=d<=1000000】, 单位km 【d是100的倍数】

第二行的充电站的个数n 【0<=n<=10000】

第3行开始,每行2个数据,分别是充电站离甲城的距离和等待的时间(单位小时)

输出

能到达终点输出最短的时间(小时),否则输出-1

import sys

# d公里数,是100的倍数  n休息站的数量
d = int(input())
n = int(input())
# lst存储充电站的坐标和等待时间,这里巧妙的将甲地也当作一个充电站,甲地坐标为0
lst = [[0, 0]]
# 输入n个充电站数据
for i in range(1, n + 1):
    lst.append(list(map(int, input().split())))
# 巧妙的将乙地也当作一个充电站
lst.append([d, 0])
# dp数组 dp[i]表示到达第i号充电站并在第i个充电站充电后花费的最短充电时间
# 【没有计算沿途驾驶时间,因为在路上开车的时间是固定的,为d/100】
# 我们把甲第当作一个序号0【第0个】的充电站
dp = [0]
#遍历第1~n+1号充电站,我们把乙地当作n+1号充电站
for i in range(1, n + 2):
    site = lst[i][0]
    time = lst[i][1]
    # 一开始设置一个大点的数
    dp.append(0x7ffffff)
    # 从后向前找相邻的充电站
    for j in range(i - 1, -1, -1):
        a_site = lst[j][0]
        a_time = lst[j][1]
        # 第i个充电站和第j个充电站的距离大于1000km则说明 【从j充电站充满电后不能直接到i充电站】
        if site - a_site > 1000:
            break
        else:
            dp[i] = min(dp[i], dp[j] + time + 1)
    # 如果dp[i]没有被更新,说明不能从前面的任何一个充电站到第i个充电站,终点不可达
    if dp[i] == 0x7ffffff:
        print(-1)
        sys.exit()
# 因为沿途的距离是固定的,所以直接加上就行,减1是因为之前将乙地当作一个充电站,充电花费的1h要减掉
print(dp[n + 1] + int(d / 100) - 1)


# 3组样例
# 1500
# 4
# 300 2
# 600 1
# 1000 0
# 1200 0
#
# 800
# 2
# 300 0
# 600 0
#
# 2000
# 4
# 300 2
# 600 1
# 900 0
# 1950 3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forgetable tree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值