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

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

Задача 1#36734

Дано число n, затем n строк, в каждой по паре натуральных различных чисел. Из каждой пары берется одно число так, чтобы итоговая сумма всех таких чисел была минимальна и кратна 3.

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

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

3

13 20

21 11

1 1

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

Вложения к задаче
Показать ответ и решение

Решение статикой.

Предположим, что после работы жадного алгоритма мы получили сумму, с остатком 2 при делении на 3.

Дифф — обозначение для какой-то разницы, от слова difference.

Итак, казалось бы все просто — можно добавить мин. дифф с остатком 1. Но на самом деле этого недостаточно. Ведь еще можно добавить к подобной сумме два мин. диффа с остатком 2. И ведь действительно: S(2) + diff(1) = (0) или S(2) + diff(2) + post_diff(2) = (0). (добавляем, так как уже посчитали минимальную сумму, теперь ее можно только увеличивать). Тоже самое и для суммы, с остатком 1.

Собственно, нужно хранить четыре разности: первые две с остатком 1, вторые с остатком 2.

    f = open(’A5-8.txt’)
    n = int(f.readline())
    ans = 0
    #индексы 0 и 1 отвечают за мин дифы с ост. 1
    #2 и 3 за мин дифы с ост. 2
    diff = [1000000]*4
    for i in range(n):
        a, b = map(int, f.readline().split())
        ans += min(a,b)
        tmp = abs(a-b)
        if tmp % 3 == 1:
            if tmp < diff[0]:
                diff[1], diff[0] = diff[0], tmp
            else:
                diff[1] = min(diff[1], tmp)
        if tmp % 3 == 2:
            if tmp < diff[2]:
                diff[3], diff[2] = diff[2], tmp
            else:
                diff[3] = min(diff[3], tmp)

    if ans % 3 == 0:
        print(ans)
    elif ans % 3 == 1:
        print(ans + min(diff[2], diff[0]+diff[1]))
    else:
        print(ans + min(diff[0], diff[2] + diff[3]))

Ответ: 5634 16765950

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

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

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

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

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

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

Бесплатное обучение
в Школково

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

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

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

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

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

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

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

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