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

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

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

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

6

8 3 4

3 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

f = open(’3_B.txt’)  # для ответа на A требуется подключить 3_A.txt
n = int(f.readline())  # Считываем количество пар из первой строки
s = 0  # Инициализируем переменную для хранения суммы
mr = [10000005000000] * 8  # Cписок минимальных остатков от деления на 8
for i in range(n):  # Проходим по каждой тройке чисел
    a, b, c = map(int, f.readline().split())  # Считываем тройку чисел
    mx = max(a, b, c)
    mn = min(a, b, c)
    md = a + b + c - mx - mn  # Находим максимальное, минимальное и среднее числа
    d1 = mx - md
    d2 = mx - mn  # Вычисляем разности для двух возможных минимальных разностей
    s += mx  # Добавляем максимальное число к сумме
    mr1 = mr[:]  # Создаем копию списка ’mr’
    # Проходим по каждому остатку от деления на 8 для первой разности
    for j in range(8):
        # Если сумма разности и элемента списка меньше чем элемент списка
        if d1 + mr1[j] < mr[(d1 + mr1[j]) % 8]:  # по остатку от деления
            # Заменяем элемент списка на сумму разности и элемента
            mr[(d1 + mr1[j]) % 8] = d1 + mr1[j]
    # Проходим по каждому остатку от деления на 8 для второй разности
    for j in range(8):
        # Если сумма разности и элемента списка меньше чем элемент списка
        if d2 + mr1[j] < mr[(d2 + mr1[j]) % 8]:
            # Заменяем элемент списка на сумму разности и элемента
            mr[(d2 + mr1[j]) % 8] = d2 + mr1[j]
    # Заменяем элемент списка по остатку на минимум между элементом и
    mr[d1 % 8] = min(mr[d1 % 8], d1)  # разностью для обеих разностей
    mr[d2 % 8] = min(mr[d2 % 8], d2)
if s % 8 != 0:  # Если сумма не делится на 8 без остатка
    s -= mr[s % 8]  # Вычитаем из суммы минимальный остаток
print(s)

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