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

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

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

5

2  7

1  8

10  2

6  4

3  3

Ответ для данного примера: 32

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

f = open(’10.txt’)
n = int(f.readline())
minS = 0  # Переменная для минимальной суммы
maxS = 0  # Переменная для конечной суммы

# Так как нужна одинаковая последняя цифра,
# которая находится с помощью взятия остатка при делении на 10,
# будем искать минимальные разности по остатку при делении на 10.
mr = [10 ** 10] * 10

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

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

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

# Если конечная макс. сумма оканчивается не на ту же цифру, что и мин. сумма,
# то значит их разность не оканчивается на 0
if (maxS - minS) % 10 != 0:
    # Отнимаем от макс. суммы разность с остатком разности мин. и макс. сумм
    # Тогда макс. сумма будет оканчиваться на нужную цифру
    maxS -= mr[(maxS - minS) % 10]

print(maxS)

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

# По сути, последняя цифра - остаток при делении на 10,
# найдем минсумму, ее остаток и возбмем из массива нужную ячейку
modul = 10


def fun(a, a_new, x):
    for j in range(modul):
        k = (a[j] + x) % modul
        a_new[k] = max(a_new[k], a[j] + x)


a = [-100000000000] * modul
a[0] = 0
minSum = 0
f = open(’10.txt’)
n = int(f.readline())
for i in range(n):
    x, y = map(int, f.readline().split())
    minSum += min(x, y)
    a_new = [-100000000000] * modul
    fun(a, a_new, x)
    fun(a, a_new, y)
    for j in range(modul):
        a[j] = a_new[j]
r = minSum % 10
print(a[r])

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