class Solution:
def minSpeedOnTime(self, A: List[int], hour: float) -> int:
""" tc O(Nlg(sumA)) sc O(1)
note, except for last trip, all the other trips takes ceiling hours to complete
speed => sum(dis_i/speed) <= hours
??? range of speed hour >= 1 => max speed sum(dist) => [1,sum(dist)]
!! edge case: when n-1 >= hour, return -1
"""
n = len(A)
l,r = 1, 10**7+1
#!!! important
if n-1 >= hour :
return -1
def cnt_h(speed,A):
h,n = 0,len(A)
for i in range(n-1):
h += ceil(A[i]/speed)
h += A[-1]/speed
return h
while l < r :
mid = (l+r)//2 #>> 1 , speed is a int so // l + (r-l+1)//2 -1
hrs = cnt_h(mid,A)
if hrs > hour: # speed is too slow
l = mid + 1#(l==mid)
else:
r = mid
return l #if cnt_h(l,A)<= hour else -1
# if h <= hour:
# return mid
# # elif isOk(mid+1,hour,dist)<=hour:
# # return mid-1
# else:
# return -1
#return mid if (dis/mid) <= hour else -1