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

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

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

Пример входных данных:

6

1 3

5 12

6 9

5 4

3 3

5 1

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

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

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

# Примечание: последняя цифра в 8-ричной записи - это остаток от деления на 8
f = open("6B.txt")
n = int(f.readline())

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

    if (r < mr) and ((r % 8) % 2 != 0):  # Если новая разность меньше и при этом нечётна
        mr = r  # Сохраняем её

# Если в итоге сумма в 8-ричной записи оканчивается на чётную цифру,
# то нужно попробовать вычесть разность
if (s % 8) % 2 == 0:
    if mr == 10 ** 10:  # Если разность не найдена (равна заданному изначально значению)
        s = 0  # Меняем сумму на 0 (как просят в условии)
    else:
        s -= mr  # Иначе вычитаем найденную разность для изменения остатка

print(s)

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

f = open("6B.txt")
n = int(f.readline())
ans = [0] * 8
for i in range(n):
    a = [int(i) for i in f.readline().split()]
    ans_new = [-1000000000] * 8
    for k in range(len(a)):
        for j in range(8):
            ost = (ans[j] + a[k]) % 8
            if ans[j] + a[k] > ans_new[ost]:
                ans_new[ost] = ans[j] + a[k]
    ans = ans_new.copy()
print(max(ans[i] for i in range(1, 8, 2)))

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