Ctrl K

Собрать k жетонов

Сложная
Дана лента из клеток cells: cells[i] = 1, если в клетке i лежит жетон, и 0, если она пуста. Нужно собрать ровно k жетонов. В начале вы один раз выбираете клетку, где будете стоять, и дальше не сходите с неё. Если в этой клетке лежит жетон, вы забираете его сразу и бесплатно (клетка становится пустой). Потом за один ход можно сделать одно из двух: - создать жетон в любой пустой клетке, кроме своей, — так можно сделать не больше max_spawns раз за всё время; - сдвинуть жетон в соседнюю пустую клетку; если он попал в вашу клетку, вы тут же его забираете. Верните наименьшее число ходов, за которое можно собрать k жетонов.
Пример 1
cells=[1, 1, 0, 0, 1, 0, 1], k=3, max_spawns=0 → 4

Встаём в клетку 1: жетон под ногами забираем даром, жетон из клетки 0 подтягиваем за 1 ход, жетон из клетки 4 ведём три хода (4 → 3 → 2 → 1). Всего 4 хода.

Пример 2
cells=[0, 0, 0, 0], k=2, max_spawns=3 → 4

Настоящих жетонов нет: дважды создаём жетон рядом с собой и подтягиваем его — 2 × 2 = 4 хода.

Пример 3
cells=[1, 0, 0, 0, 0, 0, 1], k=2, max_spawns=1 → 2
Ограничения
  • 2 ≤ len(cells) ≤ 10⁵
  • cells[i] — 0 или 1
  • 1 ≤ k ≤ 10⁵
  • 0 ≤ max_spawns ≤ 10⁵
  • sum(cells) + max_spawns ≥ k
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиКомпания в одном ряду СложнаяСвязь в самом глухом селе СложнаяПодравнять числа прибавлением СредняяКовёр на окрашенные отрезки СредняяСамый богатый ряд домов Средняя
загружаем Python…
Вход
cells=[1, 1, 0, 0, 1, 0, 1], k=3, max_spawns=0
Ожидается
4

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 98 тестов на сервере, включая скрытые.