Роботы и мигающая лента

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

Условие

В школьной лаборатории роботы украшают коридор лентой из n лампочек. Каждая лампочка либо горит (1), либо не горит (0).

Роботы хотят, чтобы на ленте горело ровно k лампочек, но безопасность требует: две соседние лампочки не могут гореть одновременно.

Если вариантов несколько, роботы выбирают тот, который выглядит «самым спокойным»: лексикографически минимальную двоичную строку длины n.

Если сделать ленту невозможно — выведите -1.

Формат ввода

Даны два целых числа n и k.

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

Выведите двоичную строку длины n, состоящую из символов 0 и 1, удовлетворяющую условиям, и среди всех таких строк — лексикографически минимальную. Если решения нет, выведите -1.

Ограничения

Пример

Ввод:

7 3

Вывод:

0010101

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

Приём: Жадное построение (ставим единицы как можно правее)

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

Сначала проверим, возможно ли вообще: максимум единиц без соседства получается, если ставить их через одну: 1010.... Тогда max_ones = (n + 1) // 2. Если k > max_ones, ответа нет.

Почему жадный приём работает: выбирая позиции единиц справа налево с шагом 2, мы не создаём 11 и одновременно минимизируем первый индекс, где строка может отличаться от другой допустимой строки (у нас там будет 0, а у любой альтернативы с единицей левее — 1, значит она хуже).

План:

Мини-сниппет:

Сложность: O(n) по времени и O(n) по памяти.

Частая ошибка: строить слева направо, ставя единицу «как можно раньше» — это даёт лексикографически максимальный вариант, а нужен минимальный (единицы должны уезжать вправо).

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

Куда дальше