Сколько минут до партии

тема: Бинарный поиск по ответу · уровень: средний

Условие

На заводе стоит линия из n станков. Станок номер *i* делает одну деталь ровно за a[i] минут и сразу начинает следующую (перерывов нет).

Начальник смены хочет понять, через сколько минут со старта на складе гарантированно будет готово k деталей (может быть больше).

Найди минимальное целое число минут.

Важно: ответ и промежуточные значения могут не помещаться в 32-битный тип (как на олимпиадах), ориентируйся на 64-битные значения.

Формат ввода

Первая строка: два целых числа n и k. Вторая строка: n целых чисел a1, a2, ..., an.

Формат вывода

Выведи одно целое число — минимальное время (в минутах), через которое суммарно будет сделано хотя бы k деталей.

Ограничения

Пример

Ввод:

3 7
3 2 5

Вывод:

8

Как решать — идея подхода

Приём: Бинарный поиск по ответу

Ключевое наблюдение: если дать линии больше времени, деталей станет не меньше. Значит, условие «успеем сделать хотя бы k» монотонное по времени, и можно искать ответ бинарным поиском.

Как проверить время t? Станок с периодом a[i] за t минут сделает ровно t // a[i] деталей (первая деталь появляется через a[i] минут, затем каждые a[i]). Тогда всего: sum(t // a[i]).

Почему бинарный поиск работает: функция made(t) = sum(t // a[i]) не убывает, поэтому множество подходящих t — это «хвост» вида [T, +∞). Нам нужен самый первый T.

План:

Сложность: O(n * log(hi)) ≈ O(n * log(min(a)*k)), при n до 8000 проходит легко.

Частая ошибка: использовать 32-битные типы/переполнить при min(a)*k или при сумме. Держи всё в 64-битных целых и делай ранний выход, как только набрали k.

Решить задачу с автопроверкой на Python →

Куда дальше