Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/2141.html
2141. Maximum Running Time of N Computers
- Difficulty: Hard.
- Related Topics: Array, Binary Search, Greedy, Sorting.
- Similar Questions: Minimum Moves to Equal Array Elements, Sell Diminishing-Valued Colored Balls, Maximum Number of Tasks You Can Assign, Minimum Time to Complete Trips, Minimum Amount of Time to Fill Cups.
Problem
You have n
computers. You are given the integer n
and a 0-indexed integer array batteries
where the ith
battery can run a computer for batteries[i]
minutes. You are interested in running all n
computers simultaneously using the given batteries.
Initially, you can insert at most one battery into each computer. After that and at any integer time moment, you can remove a battery from a computer and insert another battery any number of times. The inserted battery can be a totally new battery or a battery from another computer. You may assume that the removing and inserting processes take no time.
Note that the batteries cannot be recharged.
Return the **maximum number of minutes you can run all the n
computers simultaneously.**
Example 1:
Input: n = 2, batteries = [3,3,3]
Output: 4
Explanation:
Initially, insert battery 0 into the first computer and battery 1 into the second computer.
After two minutes, remove battery 1 from the second computer and insert battery 2 instead. Note that battery 1 can still run for one minute.
At the end of the third minute, battery 0 is drained, and you need to remove it from the first computer and insert battery 1 instead.
By the end of the fourth minute, battery 1 is also drained, and the first computer is no longer running.
We can run the two computers simultaneously for at most 4 minutes, so we return 4.
Example 2:
Input: n = 2, batteries = [1,1,1,1]
Output: 2
Explanation:
Initially, insert battery 0 into the first computer and battery 2 into the second computer.
After one minute, battery 0 and battery 2 are drained so you need to remove them and insert battery 1 into the first computer and battery 3 into the second computer.
After another minute, battery 1 and battery 3 are also drained so the first and second computers are no longer running.
We can run the two computers simultaneously for at most 2 minutes, so we return 2.
Constraints:
-
1 <= n <= batteries.length <= 105
-
1 <= batteries[i] <= 109
Solution
-
class Solution { private boolean isPossibeToRun(int n, int[] batteries, long avgTime) { long duration = 0; for (long ele : batteries) { duration += Math.min(ele, avgTime); } return avgTime * n <= duration; } public long maxRunTime(int n, int[] batteries) { long startTime = 0; long sum = 0; long ans = 0; for (long ele : batteries) { sum += ele; } long endTime = sum; while (startTime <= endTime) { long avgTime = (startTime + endTime) / 2; if (isPossibeToRun(n, batteries, avgTime)) { ans = avgTime; startTime = avgTime + 1; } else { endTime = avgTime - 1; } } return ans; } }
-
# 2141. Maximum Running Time of N Computers # https://leetcode.com/problems/maximum-running-time-of-n-computers class Solution: def maxRunTime(self, n: int, batteries: List[int]) -> int: def good(k): target = n * k have = 0 for x in batteries: have += min(x, k) return have >= target total = sum(batteries) left, right = 0, total // n res = -1 while left <= right: mid = left + (right - left) // 2 if good(mid): res = mid left = mid + 1 else: right = mid - 1 return res
-
impl Solution { #[allow(dead_code)] pub fn max_run_time(n: i32, batteries: Vec<i32>) -> i64 { // First sort the batteries let mut batteries = batteries; let m = batteries.len() as i32; batteries.sort(); let mut extra_sum: i64 = 0; for i in 0..(m - n) as usize { extra_sum += batteries[i] as i64; } let mut i = (m - n) as usize; let mut cur_height = batteries[i]; let mut ret = cur_height as i64; while extra_sum != 0 { if i + 1 == m as usize { assert!(cur_height == *batteries.last().unwrap()); ret += extra_sum / n as i64; break; } if batteries[i] == batteries[i + 1] { i += 1; continue; } let diff = extra_sum / (i - (m - n) as usize + 1) as i64; if (cur_height as i64 + diff) <= batteries[i + 1] as i64 { ret = cur_height as i64 + diff; break; } else { extra_sum -= (batteries[i + 1] - batteries[i]) as i64 * (i - (m - n) as usize + 1) as i64; ret = batteries[i + 1] as i64; } i += 1; if i != m as usize { cur_height = batteries[i]; } } ret } }
-
class Solution { public: long long maxRunTime(int n, vector<int>& batteries) { long long l = 0, r = 0; for (int x : batteries) { r += x; } while (l < r) { long long mid = (l + r + 1) >> 1; long long s = 0; for (int x : batteries) { s += min(1LL * x, mid); } if (s >= n * mid) { l = mid; } else { r = mid - 1; } } return l; } };
-
func maxRunTime(n int, batteries []int) int64 { l, r := 0, 0 for _, x := range batteries { r += x } for l < r { mid := (l + r + 1) >> 1 s := 0 for _, x := range batteries { s += min(x, mid) } if s >= n*mid { l = mid } else { r = mid - 1 } } return int64(l) } func min(a, b int) int { if a < b { return a } return b }
-
function maxRunTime(n: number, batteries: number[]): number { let l = 0n; let r = 0n; for (const x of batteries) { r += BigInt(x); } while (l < r) { const mid = (l + r + 1n) >> 1n; let s = 0n; for (const x of batteries) { s += BigInt(Math.min(x, Number(mid))); } if (s >= mid * BigInt(n)) { l = mid; } else { r = mid - 1n; } } return Number(l); }
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).