Вопрос задан 07.08.2026 в 15:27. Предмет Информатика. Спрашивает Хомич Алина.

Задача 7: Ремонт забора

Забор состоит из N одинаковых вертикальных досок. Некоторые из досок сгнили и нуждаются в замене, для каждой доски известно, нужно ли её заменить. Для ремонта забора можно использовать продающиеся в магазине щиты, которые бывают L разных видов: шириной в 1 доску, в 2 доски, ..., в L досок. Щит нельзя разрезать на части, то есть одним щитом можно заменить не более любых L подряд идущих досок. При этом можно менять не только сгнившие доски, но и хорошие.

Оказалось, что все щиты стоят одинаково, независимо от размера щита. Определите, какое наименьшее число щитов необходимо приобрести, чтобы починить весь забор.

Входные данные

Первая строка входных данных содержит целое число L (L > 0) – максимальный размер щита. Во второй строке входных данных записано целое число N (N > 0) – количество досок в заборе. Следующие N строк содержат по одному числу, равному 0 или 1. Число 1 обозначает, что соответствующая доска в заборе нуждается в замене, число 0 – что доска может быть сохранена.

Выходные данные

Программа должна вывести одно целое число – минимальное число щитов, которое необходимо приобрести для ремонта всего забора.

Система оценивания

Решение, правильно работающее только для случаев, когда числа L и N не превосходят 1000, будет оцениваться в 6 баллов.

В 10 баллов будет оцениваться решение, правильно работающее, когда числа L и N не превосходят 10⁵.

Пример

Ввод: 3, 8, 0, 0, 1, 0, 1, 0, 1, 0
Вывод: 2
Пояснение: Максимальная ширина одного щита равна 3. Забор состоит из 8 досок, нужно заменить доски с номерами 3, 5 и 7. Для этого достаточно двух щитов, например, одним щитом меняем доски с номерами 3, 4, 5, а другим щитом меняем доску с номером 7.

Перейти к ответам

Ответы на вопрос

Отвечает Грачев Максим.

Задача решается жадным алгоритмом. Так как все щиты стоят одинаково, выгодно брать щиты максимальной длины L, чтобы закрыть как можно больше досок за раз.

Алгоритм:

  • Идём по доскам слева направо.
  • Как только встречаем гнилую доску (1), мы обязаны её заменить. Ставим щит, который начинается с этой доски и накрывает L досок (или меньше, если до конца забора осталось меньше).
  • Все доски, попавшие под этот щит (и гнилые, и хорошие), считаем заменёнными и пропускаем их.
  • Продолжаем движение с первой непокрытой доски.
  • Считаем количество использованных щитов.

Такой подход даёт минимальное число щитов, потому что каждый щит мы ставим только тогда, когда это необходимо, и сразу закрываем максимально возможный участок.

В примере: L=3, доски: 0,0,1,0,1,0,1,0. Первая гнилая доска — третья. Ставим щит длиной 3, он накроет доски 3,4,5. Доска 5 тоже гнилая, её закрыли. Следующая непокрытая гнилая доска — седьмая. Ставим второй щит, он накроет доски 7,8 (только две, так как доска 8 последняя). Итого 2 щита.

Сложность такого решения — O(N), оно работает для N до 10⁵.

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос