Задача: Приливы
Денис ЯстребовСложность: 5 / 10
Оригинал: https://dmoj.ca/problem/dmopc14c7p2
Туко застрял на острове. Преодолевая скуку он начал находить обычные вещи довольно увлекательными.
Туко стал наблюдать за поведением океана и заметил, что в разное время суток уровень воды то повышается, то понижается. Туко понимал что это явление связано с приливами и стал определять разницу между уровнями воды.
С этой целью он измерил уровень воды N раз в течении дня с использованием высокоточного устройства, так что каждой из N показаний является уникальным целым числом от 1 до 1000.
Туко нужно определить разницу между абсолютно минимальным и абсолютно максимальным значениями. Между этими значениями должна быть строго возрастающая последовательность. В противном случае, если между минимальным и максимальным значениями есть хоть одно число нарушающее последовательность, все вычисления теряют смысл.
Условия и Переменные
- Туко делает N замеров за день
- В последовательности N вычислений ни одно число не повторяется
Входные параметры
- Целое число N (3 <= N <= 1000) обозначающее количество замеров
- Строка содержащая N целых чисел через пробел, обозначающих уровень воды в хронологическом порядке
# Пример ввода >>> 5 2 1 3 5 10
Выходные данные
Число обозначающее разницу воды между приливом и отливом. Если вычисления не корректны, выведите unknown
# Пример вывода 9 >>>
Решение задачи
Прежде чем смотреть решение, потратьте как минимум 2-3 часа на самостоятельное решение и отправьте код для проверки на оригинальной странице.
def get_difference():
# actions = int(input())
values = list(map(int, input().split()))
min_value_index = values.index(min(values))
max_value_index = values.index((max(values)))
sequence = values[min_value_index:max_value_index + 1]
if len(sequence) == 0:
result = 'unknown'
else:
result = sequence[-1] - sequence[0]
for i in range(len(sequence)):
if i == 0: continue
if sequence[i] < sequence[i - 1]:
result = 'unknown'
break
print(result)
Краткий анализ
В коде есть закомментированная строка. Как сказано в условии задачи, нам необходимо использовать строку ввода для определения количества необходимых замеров, но эту строку в последствии негде использовать. Она нужна для прохождения задачи на сайте, но из итогового решения ее можно стереть.
Карта решения
- Если из списка всех замеров нам нужна только некая возрастающая последовательность, нужно избавиться от всех чисел, не входящих в последовательность. Для этого находим индексы минимального и максимального значений и делаем срез от минимального до максимального значения включительно
- Далее за счет условия определяем предварительный результат. Если длина списка с последовательностью равна нулю, то итог вычислений неизвестен, иначе результат - это разница между максимальным и минимальным значениями
- Далее с помощью цикла определяем: является ли наша последовательность строго возрастающей. Если да, то результат уже вычислен, если нет, то результат неизвестен
Good coding