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升到主油箱。
解法一:数学计算(推荐) 我们可以通过数学方法直接计算最终结果,避免模拟过程:
- 计算主油箱中可以获得多少次燃油补充:
min(mainTank / 5, additionalTank) - 总燃油量 = 初始主油箱燃油 + 补充的燃油
- 距离 = 总燃油 × 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) |