博客主页:Skylar Lin
望本文能够给您带来一定的帮助,如果有错误的地方敬请斧正!
新人博主🧑,希望多多支持🍺,还有好多库存和大家分享🎁。
转载需注明出处和原作🌹。
修车的最少时间
给你一个整数数组 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
解题思路
题目要求解修理汽车所需的最少时间,且具有单调性,故考虑二分法。
需要求 mid_time 时间内,所有员工能够修理的汽车总数num
,并将该数与cars
进行比较。
class Solution {
public:
long long repairCars(vector<int>& ranks, int cars) {
sort(ranks.begin(), ranks.end());
int n = ranks.size();
long long less_time = 1, most_time = (long long)ranks[0] * cars * cars;
long long ans;
while(less_time <= most_time){
long long mid_time = (less_time + most_time) >> 1;
// 求 mid_time 时间内,所有员工能够修理的汽车总数
long long num = 0;
for(int i = 0; i < n; ++i){
num += sqrt(mid_time / ranks[i]);
}
// 判断
if(num >= cars){
ans = mid_time;
most_time = mid_time - 1;
}
else{
less_time = mid_time + 1;
}
}
return ans;
}
};