На вход программы поступает последовательность из натуральных чисел. Необходимо найти такую пару различных элементов последовательности, находящихся на расстоянии не менее
, чтобы их произведение было кратно
, сумма максимальна и хотя бы один элемент пары должен быть меньше
.
Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел (
). Каждая из следующих
строк содержит одно натуральное число, не превышающее
.
В ответе укажите два числа: сначала значение суммы искомой пары для файла А, затем для файла B.
Решение 1 (неэффективное)
f = open("27A.txt")
n = int(f.readline())
a = [int(f.readline()) for x in range(n)]
ans = 0
for i in range(n):
for j in range(i + 3, n):
if (a[i] * a[j]) % 8 == 0:
if (a[i] < 100) or (a[j] < 100):
ans = max(ans, a[i] + a[j])
print(ans)
Решение 2 (эффективное)
f = open(’17_B.txt’)
s = 3 # Расстояние между элементами
p = 8 # Чему должно быть кратно произведение
d = [8, 4, 2, 1]
n = int(f.readline())
a = [int(i) for i in f]
# Список с максимальными числами, удовлетворяющими определенным условием
# Индексы числа nums[x][y] обозначают следующее:
# x - меньше ли число чем 100 (1 - да, 0 - нет)
# y - максимальный делитель p, которому кратно число
nums = [[(-10 ** 10) for _ in range(p + 1)] for _ in range(2)]
ans = -10 ** 10
for i in range(s, n):
# Получаем индекс для первого критерия
ind = int(a[i - s] < 100)
# Ищем максимальный делитель, которому кратно число
for j in d:
if a[i - s] % j == 0:
# Обновляем максимальное число с такими характеристиками
nums[ind][j] = max(nums[ind][j], a[i - s])
break
# Перебираем все возможные делители и ищем те, при которых произведение будет кратно 8
for j in d:
if a[i] % j == 0:
# Обновляем ответ, если новая сумма больше прошлой
ans = max(ans, a[i] + nums[1][p // j])
# Если a[i] меньше 100, то его можно поставить в пару с числами больше 100
if a[i] < 100:
ans = max(ans, a[i] + nums[0][p // j])
print(ans)