М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
shamilsaidov2
shamilsaidov2
22.07.2020 20:36 •  Информатика

На аллее перед зданием министерства обороны в ряд высажены n дубов. в связи с грядущим приездом главнокомандующего, было принято решение срубить несколько деревьев для придания аллее более милитаристического вида. внутренние распорядки министерства позволяют срубать дуб только в двух случаях: * если и ближайший дуб слева, и ближайший дуб справа строго ниже, чем данный дуб. * если и ближайший дуб слева, и ближайший дуб справа строго выше, чем данный дуб. в частности, согласно этому правилу, нельзя срубить крайний левый и крайний правый дуб. министр хочет выработать такой план вырубки, чтобы в итоге осталось несколько дубов, высоты которых образуют неубывающую последовательность, то есть чтобы каждый дуб был не ниже, чем все дубы, стоящие слева от него. при этом, как человек любящий флору, министр хочет, чтобы было срублено минимальное возможное количество деревьев. сотрудникам министерства составить оптимальный план вырубки аллеи или выяснить, что срубить дубы соответствующим образом невозможно. входные данные первая строка входного файла содержит целое число n — количество дубов, растущих на аллее (2 < = n < = 200). вторая строка содержит n чисел — высоты дубов, слева направо. высоты дубов — положительные целые числа, не превышающие 1000. выходные данные если оставить последовательность дубов с неубывающими высотами невозможно, выходной файл должен содержать только одно число −1. в случае, если искомый план существует, в первую строку выходного файла выведите целое число m — минимальное количество дубов, которые необходимо срубить. в следующие m строк выведите оптимальный план вырубки деревьев — номера дубов в том порядке, в котором их следует срубать, по одному номеру на строке. дубы нумеруются слева направо натуральными числами от 1 до n. если планов с наименьшим числом срубаемых дубов несколько, выведите любой из них. пример ввод 5 3 2 4 8 5 вывод 2 2 4

👇
Ответ:
zibrov06
zibrov06
22.07.2020
Для решения этой задачи нам понадобится два обхода по массиву дубов.

Сначала мы пройдемся по массиву слева направо и будем считать, сколько дубов нужно удалить, чтобы получить неубывающую последовательность высот дубов.

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

Из полученных результатов выберем тот, который требует меньше удалений и выведем его.

Ниже представлена программа на языке Python, которая решает данную задачу:

```python
def cut_trees(n, heights):
left_to_right = [0] * n # массив для подсчета количества удалений слева направо
right_to_left = [0] * n # массив для подсчета количества удалений справа налево

# Проходимся по массиву слева направо
for i in range(n):
for j in range(i):
if heights[j] >= heights[i]:
left_to_right[i] = max(left_to_right[i], left_to_right[j] + 1)

# Проходимся по массиву справа налево
for i in range(n-1, -1, -1):
for j in range(i+1, n):
if heights[j] >= heights[i]:
right_to_left[i] = max(right_to_left[i], right_to_left[j] + 1)

max_removed = max(left_to_right) # максимальное число удаленных дубов
min_removed = n - max_removed - 1 # минимальное число удаленных дубов

if min_removed >= 0:
print(min_removed) # выводим минимальное число удаленных дубов
for i in range(n):
if left_to_right[i] + right_to_left[i] == max_removed:
print(i + 1) # выводим номера срубленных дубов
else:
print(-1) # если не получается получить неубывающую последовательность высот дубов

# Чтение входных данных
n = int(input())
heights = list(map(int, input().split()))

# Вызов функции
cut_trees(n, heights)
```

Программа сначала считывает количество дубов и высоты дубов из входного потока. Затем вызывает функцию `cut_trees` соответствующими аргументами.
4,5(42 оценок)
Проверить ответ в нейросети
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ