Разбор 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)