青训营X豆包MarsCode技术训练营第一课

67 阅读4分钟

小F计划从青海湖出发,前往一个遥远的景点X进行旅游。景点X可能是“敦煌”或“月牙泉”,线路的路径是唯一的。由于油价的不断上涨,小F希望尽量减少行程中的燃油成本。车辆的油箱容量为400L,在起始点租车时,车内剩余油量为 200L。每行驶 1km 消耗 1L 油。沿途设有多个加油站,小F可以在这些加油站补充燃油;此外,到达目标景点X还车的时候,需要保证车内剩余的油至少有 200L。

小F需要你帮助他计算,如果合理规划加油站的加油顺序和数量,最小化从青海湖到景点X的旅行成本(元)。

问题理解

小F需要从青海湖到景点X,沿途有多个加油站,每个加油站的油价不同。小F的目标是最小化从青海湖到景点X的旅行成本。车辆的油箱容量为400L,初始油量为200L,每行驶1km消耗1L油,到达景点X时油量至少需要200L。

数据结构选择

  1. 加油站信息:我们可以使用一个列表来存储每个加油站的信息,每个加油站包含两个非负整数:距离起始点的距离和油价。
  2. 当前状态:我们需要记录当前的油量、当前位置、总成本等信息。

算法步骤

  1. 初始化

    • 初始油量为200L。
    • 当前位置为0。
    • 总成本为0。
  2. 遍历加油站

    • 按照距离起始点的距离对加油站进行排序。
    • 从当前位置开始,遍历每个加油站,计算到达该加油站所需的油量和成本。
    • 如果当前油量不足以到达下一个加油站,则需要在当前加油站加油,直到油量足够到达下一个加油站。
    • 更新当前位置、油量和总成本。
  3. 到达终点

    • 如果到达景点X时油量不足200L,则返回-1。
    • 如果能够到达景点X,则返回总成本。

关键点

  • 排序:按照距离起始点的距离对加油站进行排序,确保我们按顺序访问加油站。
  • 油量管理:在每个加油站判断是否需要加油,以及加多少油,以确保能够到达下一个加油站。
  • 边界条件:处理无法到达景点X的情况,以及到达景点X时油量不足200L的情况。### 码提示

python

def solution(distance, n, 

gas_stations):

    # 初始化当前油量、当前位置和总成本

    current_fuel = 200

    current_position = 0

    total_cost = 0

    # 按照距离起始点的距离对加油站进行排序

    gas_stations.sort()

    # 遍历加油站

    for station in gas_stations:

        # 计算到达下一个加油站所需的油量

        required_fuel = station[0] 

        - current_position

        # 如果当前油量不足以到达下一个加

        油站,则需要在当前加油站加油

        if current_fuel < 

        required_fuel:

            # 计算需要加多少油

            fuel_to_add = 

            required_fuel - 

            current_fuel

            # 更新总成本

            total_cost += 

            fuel_to_add * station[1]

            # 更新当前油量

            current_fuel += 

            fuel_to_add

        # 更新当前位置和油量

        current_position = station

        [0]

        current_fuel -= 

        required_fuel

    # 到达终点时,检查油量是否足够

    if current_fuel < distance - 

    current_position:

        return -1

    # 计算到达终点所需的油量

    required_fuel = distance - 

    current_position

    if current_fuel < required_fuel:

        # 计算需要加多少油

        fuel_to_add = required_fuel 

        - current_fuel

        # 更新总成本

        total_cost += fuel_to_add * 

        gas_stations[-1][1]

    # 检查到达终点时油量是否足够

    if current_fuel + fuel_to_add < 

    200:

        return -1

    return total_cost

if name == "main":

    # 你可以添加更多测试用例

    gas_stations1 = [(100, 1), 

    (200, 30), (400, 40), (300, 20)]

    gas_stations2 = [(100, 999), 

    (150, 888), (200, 777),

                     (300, 999), 

                     (400, 1009), 

                     (450, 1019), 

                     (500, 1399)]

    gas_stations3 = [(101,), (100, 

    100), (102, 1)]

    gas_stations4 = [(34, 1), (105, 

    9), (9, 10), (134, 66), (215, 

    90), (999, 1999), (49, 0), (10, 

    1999), (200, 2),

                     (300, 500), 

                     (12, 34), (1, 

                     23), (46, 20), 

                     (80, 12), (1, 

                     1999), (90, 

                     33), (101, 

                     23), (34, 88), 

                     (103, 0), (1, 

                     1)]

    print(solution(500, 4, 

    gas_stations1) == 4300)

    print(solution(500, 7, 

    gas_stations2) == 410700)

    print(solution(500, 3, 

    gas_stations3) == -1)

    print(solution(100, 20, 

    gas_stations4) == 0)

    print(solution(100, 0, []) == 

    -1)

关键步骤解释

  1. 初始化

    • current_fuel 初始化为200L。
    • current_position 初始化为0。
    • total_cost 初始化为0。
  2. 排序

    • 使用 gas_stations.sort() 对加油站按照距离起始点的距离进行排序。
  3. 遍历加油站

    • 计算到达下一个加油站所需的油量 required_fuel
    • 如果当前油量不足以到达下一个加油站,则计算需要加多少油 fuel_to_add,并更新总成本和当前油量。
    • 更新当前位置和油量。