Задача к ЕГЭ по информатике на тему «пары/тройки чисел, выбрать из каждой, кратность» №3

Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел делилась на 17 и при этом была минимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число – минимально возможную сумму, соответствующую условиям задачи.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество пар N (1 ≤ N ≤ 1000000)  . Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.

Пример входного файла:

6

106 16

56 57

13 5

96 57

19 2

111 112

Для указанных входных данных значением искомой суммы должно быть число 255.

В ответе укажите два числа через пробел: сначала значение искомой суммы для файла А, затем для файла B.

f = open(’1.txt’)
n = int(f.readline())
krat = 17
mr = [100000000500000000]*krat
s = 0
for i in range(n):
    a,b = map(int, f.readline().split())
    s += min(a, b)
    d = abs(a-b)
    mr1 = mr[:] #копия mr
    for j in range(krat):
        #берем разность и складываем с каждым элементом списка mr1
        #сравниваем получившуюся сумму с mr
        #если она меньше, то записываем данную сумму в mr
        if d + mr1[j] < mr[(d+mr[j]) % krat]:
            mr[(d+mr[j]) % krat] = d + mr1[j]
    #проверка, что если разность меньше соответствующего элемента в списке
    #то записываем эту разность в список
    if d < mr[d % krat]:
        mr[d % krat] = d

#Если сумма s не делится на krat, то сумма корректируется
#путем добавления значения из mr[krat - s % krat]
if s % krat != 0:
    s += mr[krat - s % krat]
print(s)

Ответ: 303960 107497783
Оцените статью
Я решу все!