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

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

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

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

6

8 3

3 8

9 5

2 8

12 3

6 4

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

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

Метод минимальных разностей

f = open("27A.txt") # Открываем файл
n = int(f.readline())

k = 17 # Число, которому должна быть кратна сумма
mr = [10 ** 10] * k  # Список для хранения минимальных разностей по остаткам
s = 0  # Переменная для максимальной суммы
for i in range(n):
    a, b = map(int, f.readline().split())  # Считываем числа
    s += max(a, b)  # Прибавляем к сумме максимальное число из пары
    r = abs(a - b)  # Разность между элементами

    mr1 = mr[:]  # Создаём копию списка разностей
    for j in range(k):
        # Ищем минимальную сумму нескольких разностей
        if r + mr1[j] < mr[(r + mr1[j]) % k]:
            mr[(r + mr1[j]) % k] = r + mr1[j]

    # Если текущая разность меньше разности в списке
    if r < mr[r % k]:
        mr[r % k] = r

# Если сумма в итоге не кратна k
if s % k != 0:
    # Отнимаем от макс. суммы разность с таким же остатком
    s -= mr[s % k]

print(s)

Метод частичных сумм

f = open("27A.txt") # Открываем файл
n = int(f.readline())

k = 17
smax = [0]*k
#в smax содержится 1 элементов
#первый элемент — максимальная сумма, делящаяся на 17 без остатка
#второй элемент — максимальная сумма, которая при делении на 17 дает остаток 1 и тд
for i in range (n):
    para = list(map(int,f.readline().split()))
    sums = [x+y for x in smax for y in para]

    smax_temp = [0]*k
    for x in sums:
        smax_temp[x % k] = max(smax_temp[x % k],x)

    smax = [x for x in smax_temp if x != 0]

print(smax[0])

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