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

В текстовом файле записан набор пар натуральных чисел, не превышающих 10000  . Необходимо выбрать из набора некоторые пары так, чтобы первое число в каждой выбранной паре было нечётным, сумма бОльших чисел во всех выбранных парах была нечётной, а сумма меньших — чётной. Какую наибольшую сумму чисел во всех выбранных парах можно при этом получить?

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

4

5  2

8  15

7  14

11  9

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

Будем собирать максимальную сумму, а потом посмотрим, что получится с остатками.

Если все хорошо, то так и выведем. Если где-то нарушена четность — заводим специальную переменную,

отвечающую за минимальную сумму в паре с определенными остатками:

  • у наибольшего числа 0, у меньшего — 1;
  • у наибольшего 1, у меньшего — 0;
  • оба числа нечетные.

Останется тогда из суммы с неверным остатком (возможно из обеих) вычесть нужную комбинацию минимальных сумм.

f = open(’21.txt’)
n = int(f.readline())

sMax = 0
sMin = 0
md01 = 10000000000000000
md10 = 10000000000000000
md11 = 10000000000000000

for i in range(n):
    x, y = map(int, f.readline().split())
    if x % 2 == 1:
        maxim = max(x, y)
        minim = min(x, y)
        sMax += maxim
        sMin += minim
        if maxim % 2 == 0 and minim % 2 == 1:
            md01 = min(md01, x + y)
        if maxim % 2 == 1 and minim % 2 == 0:
            md10 = min(md10, x + y)
        if maxim % 2 == 1 and minim % 2 == 1:
            md11 = min(md11, x + y)

if sMax % 2 == 1 and sMin % 2 == 0:
    print(sMax + sMin)
elif sMax % 2 == 1 and sMin % 2 == 1:
    # Обратим внимание, что остатки 01 может иметь
    # как пара с соответствующими остатками,
    # так и две пары с остатками 10 и 11. Учтем это
    print(sMax + sMin - min(md01, md10 + md11))
elif sMax % 2 == 0 and sMin % 2 == 0:
    # Аналогично 10 = 11 + 01
    print(sMax + sMin - min(md10, md11 + md01))
elif sMax % 2 == 0 and sMin % 2 == 1:
    # Аналогично 11 = 10 + 01
    print(sMax + sMin - min(md11, md10 + md01))

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