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

Задание выполняется с использованием прилагаемых файлов

Набор данных состоит из троек натуральных чисел. Необходимо распределить все числа на три группы, при этом в каждую группу должно попасть ровно одно число из каждой исходной тройки. Сумма всех чисел в первой группе должна быть чётной, во второй – нечётной. Определите максимально возможную сумму всех чисел в третьей группе.

Входные данные

Первая строка входного файла содержит число N – общее количество троек в наборе. Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

3

1 2 3

9 16 4

6 11 7

Для указанных данных искомая сумма равна 30, она соответствует такому распределению чисел по группам: (1, 9, 6), (2, 4, 7), (3, 16, 11). Вам даны два входных файла (A и B), каждый из которых имеет описанную выше структуру. В ответе укажите два числа через пробел: сначала значение искомой суммы для файла A, затем для файла B.

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

f = open(’Задание 27B.txt’)
n = int(f.readline())

mr = 10 ** 10  # Минимальная разность
s1 = 0  # Первая сумма
s2 = 0  # Вторая сумма
s3 = 0  # Максимальная сумма
for i in range(n):
    # Считывание чисел по возрастанию с помощью сортировки sorted()
    x, y, z = sorted(map(int, f.readline().split()))
    s1 += x  # Прибавляем минимальное число тройки
    s2 += y  # Прибавляем среднее число тройки
    s3 += z  # Прибавляем наибольшее число тройки
    d1 = z - x  # Разность для возможной замены на макс. числа на мин. число
    d2 = z - y  # Разность для возможной замены на макс. числа на ср. число

    # В любом случае одна из сумм будет иметь остаток 0 или 1,
    # так что достаточно будет поменять остаток второй суммы.
    # Для этого нужно искать минимальную нечётную разность.
    if (d1 < mr) and (d1 % 2 != 0):
        mr = d1
    if (d2 < mr) and (d2 % 2 != 0):
        mr = d2

if (s1 % 2 == 0 and s2 % 2 == 1) or (s1 % 2 == 1 and s2 % 2 == 0):
    print(s3)
else:
    if mr == 10 ** 10:  # Если нечётная разность не была найдена
        print(0)
    else:  # Иначе вычитаем найденную разность для изменения остатка
        print(s3 - mr)

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

f = open(’Задание 27B.txt’)
n = int(f.readline())
s = 0
rem = 0
m = [0, -1000000000000]
for i in range(n):
    a, b, c = [int(k) for k in f.readline().split()]
    m_new = [-100000000, -100000000]
    for j in range(2):
        t = (m[j]+a) % 2
        if (m[j] + a > m_new[t]):
            m_new[t] = m[j]+a
    for j in range(2):
        t = (m[j]+b) % 2
        if (m[j] + b > m_new[t]):
            m_new[t] = m[j]+b
    for j in range(2):
        t = (m[j]+c) % 2
        if (m[j] + c > m_new[t]):
            m_new[t] = m[j]+c
    for j in range(2):
        m[j] = m_new[j]
print(m[0])

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