Метеорологическая станция ведёт наблюдение за количеством выпавших осадков. Показания записываются каждую минуту в течении N минут. Определяется пара измерений, между которыми прошло не менее K минут. Найдите максимальную сумму показаний среди таких пар.
В ответе укажите два числа: сначала значение искомой величины для файла A, затем — для файла B.
Предупреждение: для обработки файла B не следует использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго.
Решение:
для файла A — полный перебор
|
f = open('27A.txt') n = int(f.readline()) k = int(f.readline()) nums = [int(x) for x in range(f.readlines())] mx = 0 # перебираем все индексы в парах for i in range(n-k): for j in range(i+k, n): mx = max(mx, nums[i] + nums[j]) print(mx) |
для файла B
неоптимальное по памяти
При решении будем руководствоваться рассуждением:
— перебираем числа, начиная с k+1
— для каждого перебираемого числа нам нужно только одно число из начала последовательности – максимум на расстоянии ≥ k
|
f = open('27B.txt') n = int(f.readline()) k = int(f.readline()) nums = [int(x) for x in range(f.readlines())] mx_left = mx = 0 for i in range(k, n): # переопределяем максимум # в начале последовательности mx_left = max(mx_left, nums[i-k]) # переопеделяем максимум если надо mx = max(mx, nums[i] + mx_left) print(mx) |
или
сохраняем только k значений
Для удобного хранения применим очередь со сдвигом начала очереди.
|
f = open('27B.txt') n = int(f.readline()) k = int(f.readline()) nums = [int(f.readline()) for _ in range(k)] mx_left = mx = 0 for i in range(k, n): x = int(f.readline()) # переопределяем максимум # в начале последовательности mx_left = max(mx_left, nums[i%k]) # переопеделяем максимум если надо mx = max(mx, x + mx_left) # на место числа на K левее записываем х nums[i%k] = x print(mx) |
Ответ:
174902 (для файла A)
3094684 (для файла B)