Бинарный поиск по ответу
Бинарный поиск в значении ответа: если свойство монотонно — работает.
1function minMaxLoad(weights: number[], days: number): number {2 // можно ли увезти всё за days дней с лимитом L?3 function fits(L: number): boolean {4 let d = 1, cur = 05 for (const w of weights) {6 if (cur + w > L) { d++; cur = w }7 else cur += w8 }9 return d <= days10 }11 12 let lo = Math.max(...weights) // меньше не вывезти самый тяжёлый13 let hi = weights.reduce((s, w) => s + w, 0) // всё за один день14 while (lo < hi) {15 const mid = Math.floor((lo + hi) / 2)16 if (fits(mid)) hi = mid // помещаемся — пробуем меньше17 else lo = mid + 1 // не помещаемся — увеличиваем18 }19 return lo20}Проблема
Бинарный поиск в значении ответа: если свойство монотонно — работает.
Что вы видите
Границы ответа [min..max]; проверка-чёрныйящик «хватит ли X» делит пополам.
Как это работает
Мощнейшая мета-техника: минимум максимума, «за сколько дней», «какая минимальная ёмкость» — всё сводится к бинарному по монотонному предикату.
Пошаговый разбор
- 01
Предикат
fits(x) монотонен.
- 02
Деление
mid: подходит?
- 03
Сходимость
lo == hi = ответ.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Логистика
Мин. грузоподъёмность.
Сроки
Мин. дней на задачи.
Мощности
Мин. серверов под SLA.
Связанные алгоритмы
«Бинарный поиск, но не в массиве»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.