Задача: Приливы

Задача: Приливы

Денис Ястребов

Сложность: 5 / 10

Оригинал: https://dmoj.ca/problem/dmopc14c7p2


Туко застрял на острове. Преодолевая скуку он начал находить обычные вещи довольно увлекательными.

Туко стал наблюдать за поведением океана и заметил, что в разное время суток уровень воды то повышается, то понижается. Туко понимал что это явление связано с приливами и стал определять разницу между уровнями воды.

С этой целью он измерил уровень воды N раз в течении дня с использованием высокоточного устройства, так что каждой из N показаний является уникальным целым числом от 1 до 1000.

Туко нужно определить разницу между абсолютно минимальным и абсолютно максимальным значениями. Между этими значениями должна быть строго возрастающая последовательность. В противном случае, если между минимальным и максимальным значениями есть хоть одно число нарушающее последовательность, все вычисления теряют смысл.

Условия и Переменные

  1. Туко делает N замеров за день
  2. В последовательности N вычислений ни одно число не повторяется

Входные параметры

  1. Целое число N (3 <= N <= 1000) обозначающее количество замеров
  2. Строка содержащая 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)


Краткий анализ

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

Карта решения

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

Good coding

Report Page