Easy

题目描述

一辆卡车有两个油箱。给你两个整数,mainTank 表示主油箱中的燃油升数,additionalTank 表示副油箱中的燃油升数。

这辆卡车每升燃油可以行驶 10 公里。每当主油箱使用了 5 升燃油时,如果副油箱中至少有 1 升燃油,则会将 1 升燃油从副油箱转移到主油箱。

返回最大行驶距离。

注意: 从副油箱向主油箱注油不是连续的。当每消耗 5 升燃油时,转移会突然且立即发生。

示例 1:

输入:mainTank = 5, additionalTank = 10
输出:60
解释:
使用 5 升燃油后,剩余燃油为 (5 - 5 + 1) = 1 升,行驶距离为 50 公里。
再使用 1 升燃油后,不会向主油箱注油,主油箱变空。
总行驶距离为 60 公里。

示例 2:

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

约束:

  • 1 <= mainTank, additionalTank <= 100

提示:

  • 避免使用小数计算以防止精度误差。

解题思路

这道题需要模拟燃油消耗和转移的过程。关键是理解转移规则:每当主油箱消耗了5升燃油时,如果副油箱还有燃油,就会转移1升到主油箱。

解法一:数学计算(推荐) 我们可以通过数学方法直接计算最终结果,避免模拟过程:

  1. 计算主油箱中可以获得多少次燃油补充:min(mainTank / 5, additionalTank)
  2. 总燃油量 = 初始主油箱燃油 + 补充的燃油
  3. 距离 = 总燃油 × 10

需要注意的是,使用整数除法 mainTank / 5 可以得到完整的5升消耗次数。

解法二:模拟过程 也可以通过循环模拟燃油消耗和转移的过程,但相对复杂一些。每次消耗5升燃油时检查是否可以从副油箱转移燃油。

数学解法更简洁高效,是推荐的解法。

代码实现

class Solution {
public:
    int distanceTraveled(int mainTank, int additionalTank) {
        int transfers = min(mainTank / 5, additionalTank);
        int totalFuel = mainTank + transfers;
        return totalFuel * 10;
    }
};
class Solution:
    def distanceTraveled(self, mainTank: int, additionalTank: int) -> int:
        transfers = min(mainTank // 5, additionalTank)
        total_fuel = mainTank + transfers
        return total_fuel * 10
public class Solution {
    public int DistanceTraveled(int mainTank, int additionalTank) {
        int transfers = Math.Min(mainTank / 5, additionalTank);
        int totalFuel = mainTank + transfers;
        return totalFuel * 10;
    }
}
var distanceTraveled = function(mainTank, additionalTank) {
    const transfers = Math.min(Math.floor(mainTank / 5), additionalTank);
    const totalFuel = mainTank + transfers;
    return totalFuel * 10;
};

复杂度分析

复杂度数学解法
时间复杂度O(1)
空间复杂度O(1)