Тема . (старое) 27. Программирование

.04 Пары/тройки чисел, выбрать из каждой, кратность

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела (старое) 27. программирование
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#12333

В текстовом файле записан набор пар натуральных чисел, не превышающих 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

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!