Binary Search

The paradigm:

  • Having left and right indices
  • Evaluate mid
  • Based on the evaluation, update left or right accordingly
  • When left < right condition is not met, return

Segmenting ribbons

  • An array a, each element a[i] represents the length of a ribbon.
  • Obtain k ribbons of the same length, by cutting the ribbons.
  • Calculate maximum integer lengthL that is possible to obtain k ribbons.
lo, hi = 1, sum(a) // k
while lo <= hi:
    mid = (lo + hi) // 2
    possible = sum([r // mid for r in a])
    # Updating lo and hi
return lo - 1

There are two ways to update lo and hi.

# First
if possible: lo += 1
else: hi -= 1
# More efficient
if possible: lo = mid + 1
else : hi = mid - 1