目录
2594. 修车的最少时间
题目描述:
实现代码与解析:
二分
原理思路:
2594. 修车的最少时间
题目描述:
给你一个整数数组 ranks
,表示一些机械工的 能力值 。ranksi
是第 i
位机械工的能力值。能力值为 r
的机械工可以在 r * n2
分钟内修好 n
辆车。
同时给你一个整数 cars
,表示总共需要修理的汽车数目。
请你返回修理所有汽车 最少 需要多少时间。
注意:所有机械工可以同时修理汽车。
示例 1:
输入:ranks = [4,2,3,1], cars = 10 输出:16 解释: - 第一位机械工修 2 辆车,需要 4 * 2 * 2 = 16 分钟。 - 第二位机械工修 2 辆车,需要 2 * 2 * 2 = 8 分钟。 - 第三位机械工修 2 辆车,需要 3 * 2 * 2 = 12 分钟。 - 第四位机械工修 4 辆车,需要 1 * 4 * 4 = 16 分钟。 16 分钟是修理完所有车需要的最少时间。
示例 2:
输入:ranks = [5,1,8], cars = 6 输出:16 解释: - 第一位机械工修 1 辆车,需要 5 * 1 * 1 = 5 分钟。 - 第二位机械工修 4 辆车,需要 1 * 4 * 4 = 16 分钟。 - 第三位机械工修 1 辆车,需要 8 * 1 * 1 = 8 分钟。 16 分钟时修理完所有车需要的最少时间。
提示:
1 <= ranks.length <= 105
1 <= ranks[i] <= 100
1 <= cars <= 106
实现代码与解析:
二分
class Solution {
public:
bool check(long long mid, vector<int> ranks, int cars)
{
long long sum = 0;
for (auto t : ranks)
sum += (long long)sqrt(mid / t);
if (sum >= cars) return true;
else return false;
}
long long repairCars(vector<int>& ranks, int cars) {
sort(ranks.begin(), ranks.end());
long long l = 1, r = 1ll * ranks[0] * cars * cars;
while(l < r)
{
long long mid = l + r >> 1;
if (check(mid, ranks, cars)) r = mid;
else l = mid + 1;
}
return l;
}
};
原理思路:
看是否能用二分,判断一下值的范围是否有单调性,大于等于某一时间可以把车都修好,小于某一时间则不能,因此可以用二分。
二分直接套板子即可,check就是检验一下当前时间能不能把车修完,大于等于车的数量说明可以修完。文章来源:https://www.toymoban.com/news/detail-699902.html
记得开 long long ,1ll 的作用是将int临时转化为 long long 赋值给左边的 long long 类型。学到了。文章来源地址https://www.toymoban.com/news/detail-699902.html
到了这里,关于LeetCode每日一题:2594. 修车的最少时间(2023.9.7 C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!