.05 Макс/мин, кол-во пар, сумма/разность кратна/не кратна
Ошибка.
Попробуйте повторить позже
На вход подаётся последовательность из натуральных чисел, каждое из которых не больше 10000.
Найдите максимальную сумму двух различных элементов последовательности, сумма которых делится на
114.
Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (1
100000). Каждая из следующих N строк содержит одно натуральное число, не превышающее 10
000.
В ответе укажите два числа: сначала значение искомой суммы для файла А, затем, через пробел, для файла B.
Идея эффективного решения:
Идея решения заключается в том, чтобы под каждым остатком при делении на 114 собрать максимальное число с той целью, чтобы в итоге мы могли получить максимальную сумму кратную 114. Сумма пары кратна 114 в том случае, когда сумма остатков при делении на 114 пары чисел кратна 114. Считывая одно число с определенным остатком при делении на 114 мы должны подобрать в пару ему такое число, чтобы в итоге их пара была кратна 114. Не трудно определить какой остаток нужен для второго числа при делении, зная, остаток первого числа, для этого можно использовать формулу: (D - x % D) % D , где D - это 114, а x - первое число пары.
#переборный алгоритм: f = open(’1_A.txt’) #открываем файл. n = int(f.readline()) #считываем первое число - количество чисел в файле. a = [] #cписок, в котором у нас будут находиться все числа файла. for i in range(n): #проход по файлу. a.append(int(f.readline())) #добавление текущего числа в список. maxi = 0 #максимальная сумма пары. for i in range(0,len(a)-1): #перебор для первого числа пары. for j in range(i+1,len(a)): #перебор для второго числа пары. if (a[i]+a[j]) % 114 == 0: #проверка по условию. maxi = max(maxi, a[i]+a[j]) # записываем максимальную сумму пары. print(maxi) #вывод ответа.
#эффективный алгоритм: file = open(’1_B__48rmd.txt’) #открываем файл. n = int(file.readline()) #считываем первое число - количество чисел в файле. div = 114 #число, на которое нацело должна делиться сумма пары. mx = [0] * div #список, в котором под каждым индексом (под каждым остатком) записано максимальное число данного остатка. mx_sum = 0 #максимальная сумма пары for i in range(n): #проход по всему файлу x = int(file.readline()) #считываем текущее число need_ost = (div - x % div) % div #определяем необходимый остаток второго числа при делении на 114 для того чтобы сумма пары делилась нацело mx_sum = max(mx_sum,x+mx[need_ost]) #записываем максимальную сумму пары mx[x % div] = max(mx[x % div],x) #записываем максимальное число под индексом равным его остатку при делении на 114, сравниваем между текущим число и тем, что было в этой ячейке ранее print(mx_sum) #вывод ответа
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!