Найти тему

Задача 20. Пилообразная последовательность

Интересная задача с парой тонких моментов. Давайте читать условие:

Условие задачи с сайта acmp.ru
Условие задачи с сайта acmp.ru

Первое, на что стоит обратить внимание, это размер входных данных. Количество чисел до одного миллиона, и это обычно требует быстрого ввода (особенно на acmp), а удобные способы считывания данных не укладываются. Одним из способов быстрого считывания может быть считывание всей строки целиком одной операцией, а потом уже её разбор в коде и оперативной памяти. В C++ это можно реализовать с помощью stringstream, например. А в Python'е это стандартный способ ввода данных, поэтому давайте писать на нём:

Ввод данных
Ввод данных

Решать будем за один проход по массиву, поддерживая размер текущей пилообразной и размер максимальной. Тогда для очередного элемента надо будет проверить, продолжает ли он пилообразность и обновить наши значения. И тут мы встречаем второй тонкий момент - это одинаковые элементы, стоящие рядом. Например, если текущий элемент не продолжает текущую пилообразную последовательность, то возможны два варианта:

  • 1 2 3 или 3 2 1 - текущий элемент продолжает возрастающее или нисходящее движение, тогда можно говорить он начале другой пилообразной последовательности длины 2: 2 3 или 2 1 соответственно;
  • 1 2 2 - текущий элемент равен предыдущему, тогда только он является началом новой пилообразной последовательности длины 1.

Это необходимо учесть и при инициализации стартовых значений:

Инициализация стартовых значений
Инициализация стартовых значений

И при обработке каждого элемента:

Решение за один проход по массиву
Решение за один проход по массиву

Заметим, что благодаря множественным операциям сравнения в Python'е нет необходимости нагромождать сложное условие или делать его плохочитаемым с помощью арифметических операций:

Условие пилообразности
Условие пилообразности

Выбираем язык под задачу и получаем красивое решение.

Предыдущий выпуск: Задача 193. Поиск прямоугольников

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

Наука
7 млн интересуются