Имеется набор данных из целых чисел. Рассматриваются все пары различных элементов последовательности такие что
и
, при этом оба числа должны быть меньше 666. Необходимо определить максимальную сумму среди всех пар, которая будет кратна 89.
Входные данные: Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел Каждая из следующих N строк содержит одно натуральное число, не превышающее 10000.
В ответе укажите два числа через пробел: сначала значение для файла А, затем для файла B.
Идея эффективного решения:
Идея решения заключается в том, чтобы под каждым остатком при делении на 89 собрать максимальное число, меньшее 666 для того чтобы в итоге получить максимальную сумму пары. Сумма пары кратна 89 в том случае, когда сумма остатков при делении на 89 пары чисел кратна 89. Проходясь по файлу,сначала будем проверять, что число меньше 666,а затем мы будем искать для текущего числа подбирать такое число, с которым в сумме с ним будет кратна 89. Число, которое мы считываем на текущей итераций всегда будет вторым в паре (j индекс). Числа, которые уже записаны в списке — всегда будут первыми в паре(i индекс). Не трудно определить какой остаток нужен для второго числа при делении, зная, остаток первого числа, для этого можно использовать формулу: (D — x % D) % D , где D — это 89, а x — первое число пары.
#Переборный алгоритм
f = open(’27A_8.txt’) #открытие файла
n = int(f.readline()) #считываем первое число - количество чисел в файле
arr = list(map(int, f.read().split())) #список, в котором будут храниться все числа файла
mx = -1 # максимальная сумма пары
for i in range(n-1): #перебор для первого числа пары
for j in range(i+1, n): #перебор для второго числа пары
if arr[i] < arr[j] and arr[i] + arr[j] > mx and (arr[i] + arr[j]) % 89 == 0 and arr[i] < 666 and arr[j] < 666: #проверка по условию.
mx = arr[i] + arr[j] #обновляем максимальную сумму
print(mx) #вывод ответа.
#Эффективный алгоритм
file = open(’27B_8__3sht5.txt’) #открытие файла
n = int(file.readline()) #считываем первое число - количество чисел в файле
div = 89 # наш делитель
mx = [0]*div # список, в котором будет храниться максимальное число под каждым остатком при делении на 89
mx_sum = 0 # максимальная сумма пары
for i in range(n): # проход по всему файлу
x = int(file.readline()) # считываем текущее число
need_ost = (div - x % div) % div # определяем необходимый остаток для второго числа чтобы в итоге получилась пара кратная 89
if x > mx[need_ost] and x < 666: # если второе число в паре больше первого и текущее меньше 666
mx_sum = max(mx_sum,x+mx[need_ost]) # то обновляем максимальную сумму
if x < 666: # если текущее число меньше 666
mx[x % div] = max(mx[x % div],x) # обновляем максимальное число под определенным остатком, сравнивая текущее число с тем, что было записано в ячейке ранее.
print(mx_sum) # вывод ответа