August 22, 2021

Разбор 26 задачи Джобса

Канал авторов: тык, тык
Начальные знания: знание основы python, генераторы списков, работа с файлами
Статьи по другим заданиям: тык

Текст задачи:

Источник: сайт К.Ю. Полякова

Программное решение

Разбираемся с условием

Рассмотрим первые 3 ямы, которые данны в примере:

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

Возьмём следующую тройку ям

Глубину ямы 12 надо заменить на среднее число между ними. Так как глубина 10 средняя из трёх, то надо яму с глубиной 12 засыпать до глубины 10. Но стоит помнить, когда мы засыпаем яму, то на асфальт выливается вода равная объёму засыпанного.

Примечание:

Стоит помнить, когда глубина ямы увеличивается, а не уменьшается, то вода на асфальт не выливается.

Переносим в код

Сначала всё стандартно. Открываем файл, считываем количество чисел и переносим все числа в массив

f = open('26-j5 (1).txt')
n = int(f.readline())
a = [int(f.readline()) for i in range(n)]

Создадим массив b - копию массива a, в котором будут храниться новые глубины ям и переменную s, которая будет считать количество вылитой на асфальт воды

b = a.copy()
s = 0

Теперь можно запустить цикл for со второго элемента(индекс в массиве 1) до предпредпоследнего элемента (индекс в массиве n-1).

Мы будем перебирать глубину ямы и двух смежных с ней

Давайте эти 3 элемента положим в массив и сортируем по порядку с помощью метода sorted(). Возьмём число с индексом 1. Всегда это число будет среднее из трёх.

Будем сохранять новую яму в массив b под iтым индексом

for i in range(1, n-1):
    b[i] = sorted([a[i-1], a[i], a[i+1]])[1]

Заметим также, что если разница между a[i] и новой глубинной положительна, то вода будет выливаться на асфальт, а разница между a[i] и новой глубинной будет равна объёму вылитой воды.

Поэтому мы можем добавить такую проверку

    if a[i] - b[i]:
        s += a[i] - b[i]

Чтобы найти количество ям с минимальной глубиной, воспользуемся функцией count(), которая вернёт количество повторений элемента в массиве

print(b.count(min(b)), s)

Код полностью

f = open('26-j5 (1).txt')
n = int(f.readline())
a = [int(f.readline()) for i in range(n)]
b = a.copy()
s = 0
for i in range(1, n-1):
    b[i] = sorted([a[i-1], a[i], a[i+1]])[1]
    if a[i] - b[i] > 0:
        s += a[i] - b[i]


print(b.count(min(b)), s)

Канал авторов: тык, тык