Welcome to Subscribe On Youtube
774. Minimize Max Distance to Gas Station
Description
You are given an integer array stations
that represents the positions of the gas stations on the x-axis. You are also given an integer k
.
You should add k
new gas stations. You can add the stations anywhere on the x-axis, and not necessarily on an integer position.
Let penalty()
be the maximum distance between adjacent gas stations after adding the k
new stations.
Return the smallest possible value of penalty()
. Answers within 10-6
of the actual answer will be accepted.
Example 1:
Input: stations = [1,2,3,4,5,6,7,8,9,10], k = 9 Output: 0.50000
Example 2:
Input: stations = [23,24,36,39,46,56,57,65,84,98], k = 1 Output: 14.00000
Constraints:
10 <= stations.length <= 2000
0 <= stations[i] <= 108
stations
is sorted in a strictly increasing order.1 <= k <= 106
Solutions
-
class Solution { public double minmaxGasDist(int[] stations, int k) { double left = 0, right = 1e8; while (right - left > 1e-6) { double mid = (left + right) / 2.0; if (check(mid, stations, k)) { right = mid; } else { left = mid; } } return left; } private boolean check(double x, int[] stations, int k) { int s = 0; for (int i = 0; i < stations.length - 1; ++i) { s += (int) ((stations[i + 1] - stations[i]) / x); } return s <= k; } }
-
class Solution { public: double minmaxGasDist(vector<int>& stations, int k) { double left = 0, right = 1e8; auto check = [&](double x) { int s = 0; for (int i = 0; i < stations.size() - 1; ++i) { s += (int) ((stations[i + 1] - stations[i]) / x); } return s <= k; }; while (right - left > 1e-6) { double mid = (left + right) / 2.0; if (check(mid)) { right = mid; } else { left = mid; } } return left; } };
-
class Solution: def minmaxGasDist(self, stations: List[int], k: int) -> float: def check(x): return sum(int((b - a) / x) for a, b in pairwise(stations)) <= k left, right = 0, 1e8 while right - left > 1e-6: mid = (left + right) / 2 if check(mid): right = mid else: left = mid return left
-
func minmaxGasDist(stations []int, k int) float64 { check := func(x float64) bool { s := 0 for i, v := range stations[:len(stations)-1] { s += int(float64(stations[i+1]-v) / x) } return s <= k } var left, right float64 = 0, 1e8 for right-left > 1e-6 { mid := (left + right) / 2.0 if check(mid) { right = mid } else { left = mid } } return left }