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

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

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

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

Задача 1#49391

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

В ответе введите результаты для файлов A и B без разделителей.

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

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

f = open(’27B.txt’)
n = int(f.readline())
k = 6  # Число, которому сумма не должна быть кратна
mr = 10 ** 10  # Минимальная разность
s = 0  # Максимальная сумма
for i in range(n):
    # Считывание чисел по возрастанию с помощью сортировки sorted()
    x, y, z, w = sorted(map(int, f.readline().split()))
    s += w  # Прибавляем наибольшее число из четвёрки
    d1 = w - z  # Разность для возможной замены на макс. числа на предмакс. число
    d2 = w - y  # Разность для возможной замены на макс. числа на предмин. число
    d3 = w - x  # Разность для возможной замены на макс. числа на мин. число

    for d in d1, d2, d3:  # Перебираем разности
        # Если разность d меньше минимальной разности mr,
        # и при этом d не кратно k для изменения остатка
        if (d < mr) and (d % k != 0):
            mr = d

if s % k == 0:  # Если сумма по итогу оказалась кратна k
    s -= mr  # Отнимаем от максимальной суммы минимальную разность

print(s)

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

f = open(’27B.txt’)
n = int(f.readline())

k = 6
smax = [0] * k #здесь будут храниться максимальные суммы для каждого из остатков при делении на 6
               #первый элемент — макс.сумма, которая при делении на 6 дает остаток 0
               #второй элемент — макс.сумма, которая при делении на 6 дает остаток 1
               #третий элемент — макс.сумма, которая при делении на 6 дает остаток 2 и так далее

for i in range(n):
    # Сохраним здесь числа из текущей четвёрки
    quart = list(map(int, f.readline().split()))
    # Формируем суммы с текущими числами
    sums = [x + y for x in smax for y in quart]

    # Копируем smax во временную переменную smax_temp для сравнения сумм
    smax_temp = smax.copy()
    # Сравниваем получившиеся суммы с суммами из smax_temp, записываем результат
    for x in sums:
        smax_temp[x % k] = max(smax_temp[x % k], x)
    # Копируем получившийся список в smax
    smax = smax_temp.copy()
    print(smax)
a = smax.pop(0) #удаляем первый элемент, так как у него остаток 0 при делении на 6
print(max(smax))

Ответ: 2939560735

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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