We want to minimize the maximum distance D between adjacent gas stations after adding K more stations. If we try a value for D, we can check if it’s possible to add at most K stations so that no gap exceeds D. If yes, try a smaller D; if not, try a larger D. This is a classic binary search on the answer.
classSolution {
public:double minmaxGasDist(vector<int>& s, int k) {
double l =0, r = s.back() - s.front(), eps =1e-6;
while (r - l > eps) {
double m = (l + r) /2, cnt =0;
for (int i =1; i < s.size(); ++i)
cnt += ceil((s[i] - s[i-1]) / m) -1;
if (cnt > k) l = m;
else r = m;
}
return l;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import"math"funcminmaxGasDist(s []int, kint) float64 {
l, r:=0.0, float64(s[len(s)-1]-s[0])
eps:=1e-6forr-l > eps {
m:= (l+r) /2cnt:=0fori:=1; i < len(s); i++ {
cnt+= int(math.Ceil(float64(s[i]-s[i-1])/m)) -1 }
ifcnt > k {
l = m } else {
r = m }
}
returnl}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classSolution {
publicdoubleminmaxGasDist(int[] s, int k) {
double l = 0, r = s[s.length-1]- s[0], eps = 1e-6;
while (r - l > eps) {
double m = (l + r) / 2;
int cnt = 0;
for (int i = 1; i < s.length; i++)
cnt += (int)Math.ceil((s[i]- s[i-1]) / m) - 1;
if (cnt > k) l = m;
else r = m;
}
return l;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution {
funminmaxGasDist(s: IntArray, k: Int): Double {
var l = 0.0var r = (s.last() - s.first()).toDouble()
val eps = 1e-6while (r - l > eps) {
val m = (l + r) / 2var cnt = 0for (i in1 until s.size)
cnt +=Math.ceil((s[i] - s[i-1]) / m).toInt() - 1if (cnt > k) l = m
else r = m
}
return l
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import math
classSolution:
defminmaxGasDist(self, s: list[int], k: int) -> float:
l, r =0, s[-1] - s[0]
eps =1e-6while r - l > eps:
m = (l + r) /2 cnt =0for i in range(1, len(s)):
cnt += math.ceil((s[i] - s[i-1]) / m) -1if cnt > k:
l = m
else:
r = m
return l
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
impl Solution {
pubfnminmax_gas_dist(s: Vec<i32>, k: i32) -> f64 {
let (mut l, mut r) = (0.0, (s[s.len()-1] - s[0]) asf64);
let eps =1e-6;
while r - l > eps {
let m = (l + r) /2.0;
letmut cnt =0;
for i in1..s.len() {
cnt += ((s[i] - s[i-1]) asf64/ m).ceil() asi32-1;
}
if cnt > k {
l = m;
} else {
r = m;
}
}
l
}
}