总行驶距离

标签: 数学 模拟

难度: Easy

卡车有两个油箱。给你两个整数,mainTank 表示主油箱中的燃料(以升为单位),additionalTank 表示副油箱中的燃料(以升为单位)。

该卡车每耗费 1 升燃料都可以行驶 10 km。每当主油箱使用了 5 升燃料时,如果副油箱至少有 1 升燃料,则会将 1 升燃料从副油箱转移到主油箱。

返回卡车可以行驶的最大距离。

注意:从副油箱向主油箱注入燃料不是连续行为。这一事件会在每消耗 5 升燃料时突然且立即发生。

示例 1:

输入:mainTank = 5, additionalTank = 10
输出:60
解释:
在用掉 5 升燃料后,主油箱中燃料还剩下 (5 - 5 + 1) = 1 升,行驶距离为 50km 。
在用掉剩下的 1 升燃料后,没有新的燃料注入到主油箱中,主油箱变为空。
总行驶距离为 60km 。

示例 2:

输入:mainTank = 1, additionalTank = 2
输出:10
解释:
在用掉 1 升燃料后,主油箱变为空。
总行驶距离为 10km 。

提示:

  • 1 <= mainTank, additionalTank <= 100

Submission

运行时间: 38 ms

内存: 16.1 MB

class Solution:
    def distanceTraveled(self, mainTank: int, additionalTank: int) -> int:
        ans = 0
        while mainTank >= 5:
            mainTank -= 5
            ans += 50
            if additionalTank > 0:
                additionalTank -= 1
                mainTank += 1
        return ans + mainTank * 10

Explain

此题解采用的思路是模拟卡车的行驶过程。当主油箱中的燃料大于等于5升时,每次消耗5升燃料来行驶50km。同时,如果副油箱中有燃料,则从副油箱中取出1升燃料补充到主油箱中。这个过程重复进行,直到主油箱的燃料少于5升。最后,如果主油箱中还有剩余燃料,则计算剩余燃料能行驶的距离,加到总距离中。

时间复杂度: O(mainTank)

空间复杂度: O(1)

class Solution:
    def distanceTraveled(self, mainTank: int, additionalTank: int) -> int:
        ans = 0
        while mainTank >= 5:
            mainTank -= 5  # 消耗5升主油箱燃料
            ans += 50      # 行驶50km
            if additionalTank > 0:
                additionalTank -= 1  # 从副油箱取出1升燃料
                mainTank += 1        # 补充到主油箱
        return ans + mainTank * 10  # 计算剩余燃料能行驶的距离

Explore

这种策略是为了平衡燃料的使用和保证主油箱有足够的燃料进行下一段行驶。取出1升是一种保守的策略,确保在不知副油箱燃料总量的情况下,尽量延长燃料的使用时间。存在更有效的策略,例如根据副油箱的剩余燃料量动态调整转移的燃料量,如果副油箱燃料充足,可以考虑一次性转移更多燃料到主油箱,以减少中途的转移次数,提高行驶效率。

在这种情况下,算法仍然能够正确地处理。即使副油箱燃料用完,主油箱不足5升时,算法将停止主油箱的常规行驶过程(每5升行驶50km),并且将主油箱剩余的燃料按每升燃料10km的比例计算剩余可行驶距离,加到总距离中。这确保了所有燃料都被用于行驶,没有浪费。

题解中的方法确实考虑了主油箱或副油箱初始值为0的情况。如果主油箱初始值为0,则算法从开始就不会进入循环,直接返回0km。如果副油箱初始值为0,则算法不会从副油箱中转移燃料,但主油箱中的燃料仍然可以用来行驶,直到燃料耗尽。

是的,这种处理方式考虑了所有剩余燃料的可能情况。题解中的算法保证了每次主油箱燃料不足5升时停止大规模行驶,剩余燃料按照每升10km进行转换,确保了算法的准确性和燃料的完全使用,无论主油箱剩余多少燃料都能被转换为相应的行驶距离。