Тема 27. Программирование – оптимизация по времени и по памяти

27.07 Прочие прототипы

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

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

Задача 1#25112

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

Шестиклассник Коля совсем недавно узнал, что такое НОД и НОК — наибольший общий делитель и наименьшее общее кратное некоторого набора натуральных чисел. Ему так понравилась эта тема, поэтому он решил потренироваться и в случайном порядке начал выписывать на доску от 2  до 10  натуральных чисел в строчку и попарно начал находить для них НОКи. Его друг Ваня предложил Коле следующую задачу: из каждой строки нужно выбрать один из НОКов, причем так, чтобы их сумма была наибольшей, а также кратна 8  или 11  .

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

Формат входных данных

Первая строка входных данных содержит число n — количество строк,          5
1 ≤ n ≤ 10  . Следующие n  строк содержат натуральное число 2 ≤ k ≤ 10  , обозначающее количество чисел в строке, затем k  натуральных чисел в этой строке.

Формат выходных данных

Программа должна вывести целое число — максимальную сумму, кратную 8  или 11  .

Пример:

4

2 8 6

3 2 7 8

2 6 5

4 7 3 8 6

Ответом для примера будет: 152

Рассмотрим пример из условия. Для указанных входных данных значения НОК для первой строки — 24  ; для второй строки — 14,8,56;  для третьей группы — 30  , для четвёртой группы — 6,21,24,24,42,56.  Значением искомой суммы должно быть число 152 (24+ 56+ 30+ 42)  .

Вложения к задаче
Показать ответ и решение
def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)


def lcm(a, b):
    return (a*b)//gcd(a, b)


def h(x, m, m_new):
    for j in range(88):
        ost = (m[j]+x) % 88
        if (m[j]+x > m_new[ost]):
            m_new[ost] = m[j]+x


f = open(’Задание 27 B.txt’)
m = [-1000000]*88
m[0] = 0
n = int(f.readline())
for i in range(n):
    a = [int(p) for p in f.readline().split()]
    k = a[0]
    b = []
    for i in range(1, len(a)):
        for j in range(i+1, len(a)):
            b.append(lcm(a[i], a[j]))
    m_new = [-10000000]*88
    for x in b:
        h(x, m, m_new)
    for j in range(88):
        m[j] = m_new[j]
ans = -10000000
for r in range(88):
    if r % 8 == 0 or r % 11 == 0:
        ans = max(ans, m[r])
print(ans)

Ответ: 15828043 15067144608

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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