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

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

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

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

Задача 81#63439Максимум баллов за задание: 2

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

Входные данные: В первой строке вводится количество пар N (1 ≤ N ≤ 100000)  . Каждая из следующих N строк содержит два натуральных числа, не превышающих 10000.

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

6

106 16

56 57

13 5

96 57

19 2

111 112

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

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

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

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

f = open("27B.txt")  # Открываем нужный файл
n = int(f.readline())

k = 8  # Число, которому должна быть кратна сумма
mr = [10 ** 10] * k  # Список для хранения минимальных разностей по остаткам
s = 0  # Переменная для минимальной суммы
for i in range(n):
    a, b = map(int, f.readline().split())  # Считываем числа
    s += min(a, b)  # Прибавляем к сумме минимальное число из пары
    r = abs(a - b)  # Разность между элементами

    mr1 = mr[:]  # Создаём копию списка разностей
    for j in range(k):
        # Ищем минимальную сумму нескольких разностей
        if r + mr1[j] < mr[(r + mr1[j]) % k]:
            mr[(r + mr1[j]) % k] = r + mr1[j]

    # Если текущая разность меньше разности в списке
    if r < mr[r % k]:
        mr[r % k] = r

# Если сумма в итоге не кратна k
if s % k != 0:
    # Прибавляем к мин. сумме разность с недостающим остатком
    s -= mr[k - s % k]

print(s)

Ответ: 109144 289387916

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

Задача 82#63441Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла (файл A  и файл B  ), каждый из которых содержит в первой строке количество пар N  (1 ≤ N ≤ 100000).  Каждая из следующих N  строк содержит два натуральных числа, не превышающих 10000.

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

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

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

f = open("27B.txt")  # Открываем нужный файл
n = int(f.readline())

k = 13  # Число, которому должна быть кратна сумма
mr = [10 ** 10] * k  # Список для хранения минимальных разностей по остаткам
s = 0  # Переменная для максимальной суммы
for i in range(n):
    a, b = map(int, f.readline().split())  # Считываем числа
    s += max(a, b)  # Прибавляем к сумме максимальное число из пары
    r = abs(a - b)  # Разность между элементами

    mr1 = mr[:]  # Создаём копию списка разностей
    for j in range(k):
        # Ищем минимальную сумму нескольких разностей
        if r + mr1[j] < mr[(r + mr1[j]) % k]:
            mr[(r + mr1[j]) % k] = r + mr1[j]

    # Если текущая разность меньше разности в списке
    if r < mr[r % k]:
        mr[r % k] = r

# Если сумма в итоге не кратна k
if s % k != 0:
    # Отнимаем от макс. суммы разность с таким же остатком
    s -= mr[s % k]

print(s)

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

f = open("27B.txt")  # Открываем нужный файл
n = int(f.readline())
s = [0]#массив,в котором будут храниться суммы промежуточные каждой строки
for i in range(n):
    pair = [int(x) for x in f.readline().split()]#разбиение строки на пары чисел
    s = [a+b for a in s for b in pair]#всевозможные суммы на строке
    s ={x % 13:x for x in sorted(s)}.values()#словарь,в котором ключ- это остаток числа на 13,значение это
    #отсортированные по возрастанию всевозможные суммы на этой строке
print(max(x for x in s if x % 13 == 0))

Ответ: 1936948 548738593

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

Задача 83#63445Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

3 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

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

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

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

    mr1 = mr[:]  # Копия списка разностей
    # Перебираем обе разности
    for d in d1, d2:
        # Составляем суммы нескольких разностей для получения различных остатков
        for j in range(k):
            if d + mr1[j] < mr[(d + mr1[j]) % k]:
                mr[(d + mr1[j]) % k] = d + mr1[j]
        # Если сама по себе разность меньше, то заменяем соответствующую разность
        if d < mr[d % k]:
            mr[d % k] = d

# Если сумма по итогу оказалась не кратна k
if s % k != 0:
    # Отнимаем от максимальной суммы разность с таким же остатком,
    # чтобы в итоге остаток стал равен 0
    s -= mr[s % k]

print(s)

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

f = open("27B.txt") # Открываем нужный файл
n = int(f.readline())

k = 13
smax = [0]*k
#в smax содержится 13 элементов
#первый элемент — максимальная сумма, делящаяся на 13 без остатка
#второй элемент — максимальная сумма, которая при делении на 13 дает остаток 1 и тд
for i in range (n):
    troyka = list(map(int,f.readline().split()))
    sums = [x+y for x in smax for y in troyka]

    smax_temp = [0]*k
    for x in sums:
        smax_temp[x % k] = max(smax_temp[x % k],x)

    smax = [x for x in smax_temp if x != 0]

print(smax[0])

Ответ: 14417 45442137

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

Задача 84#63446Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество пар N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.

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

6

8 3

3 8

9 5

2 8

12 3

7 4

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

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

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

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

f = open("27B.txt") # Открываем нужный файл
n = int(f.readline())

k = 7 # Число, которому должна быть кратна сумма
mr = [10 ** 10] * k  # Список для хранения минимальных разностей по остаткам
s = 0  # Переменная для максимальной суммы
for i in range(n):
    a, b = map(int, f.readline().split())  # Считываем числа
    s += max(a, b)  # Прибавляем к сумме максимальное число из пары
    r = abs(a - b)  # Разность между элементами

    mr1 = mr[:]  # Создаём копию списка разностей
    for j in range(k):
        # Ищем минимальную сумму нескольких разностей
        if r + mr1[j] < mr[(r + mr1[j]) % k]:
            mr[(r + mr1[j]) % k] = r + mr1[j]

    # Если текущая разность меньше разности в списке
    if r < mr[r % k]:
        mr[r % k] = r

# Если сумма в итоге не кратна k
if s % k != 0:
    # Отнимаем от макс. суммы разность с таким же остатком
    s -= mr[s % k]

print(s)

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

f = open("27B.txt") # Открываем нужный файл
n = int(f.readline())

k = 7
smax = [0]*k
# в smax содержится 1 элементов
# первый элемент — максимальная сумма, делящаяся на 7 без остатка
# второй элемент — максимальная сумма, которая при делении на 7 дает остаток 1 и тд
for i in range(n):
    para = list(map(int, f.readline().split()))
    sums = [x+y for x in smax for y in para]

    smax_temp = [0]*k
    for x in sums:
        smax_temp[x % k] = max(smax_temp[x % k],x)

    smax = [x for x in smax_temp if x != 0]

print(smax[0])

Ответ: 127127 399762090

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

Задача 85#63447Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

3 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

Вложения к задаче
Показать ответ и решение
f = open(’3_B.txt’)  # для ответа на A требуется подключить 3_A.txt
n = int(f.readline())  # Считываем количество пар из первой строки
s = 0  # Инициализируем переменную для хранения суммы
mr = [10000005000000] * 8  # Cписок минимальных остатков от деления на 8
for i in range(n):  # Проходим по каждой тройке чисел
    a, b, c = map(int, f.readline().split())  # Считываем тройку чисел
    mx = max(a, b, c)
    mn = min(a, b, c)
    md = a + b + c - mx - mn  # Находим максимальное, минимальное и среднее числа
    d1 = mx - md
    d2 = mx - mn  # Вычисляем разности для двух возможных минимальных разностей
    s += mx  # Добавляем максимальное число к сумме
    mr1 = mr[:]  # Создаем копию списка ’mr’
    # Проходим по каждому остатку от деления на 8 для первой разности
    for j in range(8):
        # Если сумма разности и элемента списка меньше чем элемент списка
        if d1 + mr1[j] < mr[(d1 + mr1[j]) % 8]:  # по остатку от деления
            # Заменяем элемент списка на сумму разности и элемента
            mr[(d1 + mr1[j]) % 8] = d1 + mr1[j]
    # Проходим по каждому остатку от деления на 8 для второй разности
    for j in range(8):
        # Если сумма разности и элемента списка меньше чем элемент списка
        if d2 + mr1[j] < mr[(d2 + mr1[j]) % 8]:
            # Заменяем элемент списка на сумму разности и элемента
            mr[(d2 + mr1[j]) % 8] = d2 + mr1[j]
    # Заменяем элемент списка по остатку на минимум между элементом и
    mr[d1 % 8] = min(mr[d1 % 8], d1)  # разностью для обеих разностей
    mr[d2 % 8] = min(mr[d2 % 8], d2)
if s % 8 != 0:  # Если сумма не делится на 8 без остатка
    s -= mr[s % 8]  # Вычитаем из суммы минимальный остаток
print(s)

Ответ: 536 300229424

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

Задача 86#63448Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество пар N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.

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

6

8 3

3 8

9 5

2 8

12 3

6 4

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

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

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

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

f = open("27A.txt") # Открываем файл
n = int(f.readline())

k = 17 # Число, которому должна быть кратна сумма
mr = [10 ** 10] * k  # Список для хранения минимальных разностей по остаткам
s = 0  # Переменная для максимальной суммы
for i in range(n):
    a, b = map(int, f.readline().split())  # Считываем числа
    s += max(a, b)  # Прибавляем к сумме максимальное число из пары
    r = abs(a - b)  # Разность между элементами

    mr1 = mr[:]  # Создаём копию списка разностей
    for j in range(k):
        # Ищем минимальную сумму нескольких разностей
        if r + mr1[j] < mr[(r + mr1[j]) % k]:
            mr[(r + mr1[j]) % k] = r + mr1[j]

    # Если текущая разность меньше разности в списке
    if r < mr[r % k]:
        mr[r % k] = r

# Если сумма в итоге не кратна k
if s % k != 0:
    # Отнимаем от макс. суммы разность с таким же остатком
    s -= mr[s % k]

print(s)

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

f = open("27A.txt") # Открываем файл
n = int(f.readline())

k = 17
smax = [0]*k
#в smax содержится 1 элементов
#первый элемент — максимальная сумма, делящаяся на 17 без остатка
#второй элемент — максимальная сумма, которая при делении на 17 дает остаток 1 и тд
for i in range (n):
    para = list(map(int,f.readline().split()))
    sums = [x+y for x in smax for y in para]

    smax_temp = [0]*k
    for x in sums:
        smax_temp[x % k] = max(smax_temp[x % k],x)

    smax = [x for x in smax_temp if x != 0]

print(smax[0])

Ответ: 120360 36898619

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

Задача 87#63449Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000  .

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

6

8 3 4

3 8 12

9 5 6

2 8 3

12 3 5

7 3 12

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

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

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

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

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

    mr1 = mr[:]  # Копия списка разностей
    # Перебираем обе разности
    for d in d1, d2:
        # Составляем суммы нескольких разностей для получения различных остатков
        for j in range(k):
            if d + mr1[j] < mr[(d + mr1[j]) % k]:
                mr[(d + mr1[j]) % k] = d + mr1[j]
        # Если сама по себе разность меньше, то заменяем соответствующую разность
        if d < mr[d % k]:
            mr[d % k] = d

# Если сумма по итогу оказалась не кратна k
if s % k != 0:
    # Отнимаем от максимальной суммы разность с таким же остатком,
    # чтобы в итоге остаток стал равен 0
    s -= mr[s % k]

print(s)

Ответ: 12558 644261256

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

Задача 88#63450Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

3 8 12

9 5 6

2 8 3

12 3 5

7 3 12

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

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

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

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

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

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

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

print(s)

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

f = open(’D:/5_A.txt’)
n = int(f.readline())
sm = 0
# Список с суммами с разными остатками.
# Изначально суммы пустые.
m = [0]*6
for i in range(n):
    nums = list(map(int, f.readline().split()))
    # Собираем в отдельном списке суммы из всевозможных пар из тройки
    pairs = []
    for j in range(len(nums)):
        for k in range(j+1, len(nums)):
            pairs.append(nums[j]+nums[k])
    # Временный массив с суммами.
    m_new = [0] * 6
    # Перебор разных сумм со всеми суммами пар из тройки.
    # Суммы из m будут сравниваться между собой посредством условий.
    for t in range(6):
        for p in pairs:
            if m[t] + p > m_new[(m[t] + p) % 6]:
                m_new[(m[t] + p) % 6] = m[t] + p
    # Сохраняем получившийся массив в m
    m = m_new.copy()
# Просят максимальное, не кратное 6.
# Значит берём максимальное из m[1:]
print(m[1:])

Ответ: 1315871 14723716730

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

Задача 89#63847Максимум баллов за задание: 2

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

Программа должна напечатать одно число – максимально возможную сумму, соответствующую условиям задачи.

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

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

Идея решения: Так как нужно получить максимальную сумму, то будем выбирать из каждой пары максимальное число, не обращая внимания на кратность. Если итоговая сумма получилась кратной 28, то необходимо заменить одно выбранное число другим числом из пары, при этом заменить нужно так, чтобы итоговая сумма уменьшилась минимально. Для этого на каждом шаге будем сохранять минимальную разницу между элементами пары, такую что разница не кратна 28, потому что если разница будет кратна 28, то замена не даст другой кратности у итоговой суммы.

f = open(’1.txt’)
n = int(f.readline())
s = 0
# переменная для хранения минимальной разницы между числами пары
mr = 1000000500000
for i in range(n):
    # считываем числа
    a, b = map(int, f.readline().split())
    # для того чтобы итоговая сумма получилась максимальной берем максимальное из пары
    s += max(a, b)
    # обновляем минимальную разницу НЕ кратную 28
    if (abs(a-b) < mr) and (abs(a-b) % 28 != 0):
        mr = abs(a-b)
# если результирующая сумма получилась кратной 28, то отнимаем разницу
if s % 28 == 0:
    s -= mr
print(s)

Ответ: 13185 7989170

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

Задача 90#63848Максимум баллов за задание: 2

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

Программа должна напечатать одно число – минимально возможную сумму, соответствующую условиям задачи.

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

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

Идея решения: Так как нужно получить минимальную сумму, то будем выбирать из каждой пары минимальное число, не обращая внимания на кратность. Если итоговая сумма получилась кратной 2, то необходимо заменить одно выбранное число другим числом из пары, при этом заменить нужно так, чтобы итоговая сумма увеличилась минимально. Для этого на каждом шаге будем сохранять минимальную разницу между элементами пары, такую что разница не кратна 2, потому что если разница будет кратна 2, то замена не даст другой кратности у итоговой суммы.

f = open(’1.txt’)
n = int(f.readline())
s = 0
# переменная для хранения минимальной разницы между числами пары
mr = 1000000500000
for i in range(n):
    # считываем числа
    a, b = map(int, f.readline().split())
    # для того чтобы итоговая сумма получилась минимальной берем минимальное из пары
    s += min(a, b)
    # обновляем минимальную разницу НЕ кратную 2
    if (abs(a-b) < mr) and (abs(a-b) % 2 != 0):
        mr = abs(a-b)
# если результирующая сумма получилась кратной 2, то прибавляем разницу
if s % 2 == 0:
    s += mr
print(s)

Ответ: 6419 200157481

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

Задача 91#63937Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла (файл A  и файл B  ), каждый из которых содержит в первой строке количество пар N  (1 ≤ N ≤ 100000).  Каждая из следующих N  строк содержит два натуральных числа, не превышающих 10000.

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

Вложения к задаче
Показать ответ и решение
f = open(’27a.txt’)
n = int(f.readline())
r = [100000000000]*5
s = 0
for i in range(n):
    a, b = map(int, f.readline().split())
    s += max(a, b)
    d = abs(a - b)
    r1 = r[:]
    for j in range(5):
        if d+r1[j] < r1[(d+r1[j]) % 5]:
            r[(d + r1[j]) % 5] = d+r1[j]
    if d < r[d % 5]:
        r[d % 5] = d
if s % 5 != 0:
    s -= r[s % 5]
print(s)

Ответ: 68110 871159315

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

Задача 92#64034Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A  и файл B  , каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 100000).  Каждая из следующих N  строк содержит три натуральных числа, не превышающих 10000.

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

3

1 2 3

9 12 4

6 9 7

Для указанных данных искомая сумма равна 11, она соответствует такому распределению чисел по группам: (2, 12, 9), (3, 9, 7), (1, 4, 6).

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

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

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

Идея решения:

Будем составлять из всех троек 3 суммы: первая будет состоять из максимальных чисел, вторая - из средних чисел, третья - из минимальных чисел.

Обозначим их как S1  , S2  и S3  .

Задача состоит в том, чтобы минимизировать сумму S3  , но при этом нужно, чтобы суммы S1  и S2  были нечётными. Значит нужно найти такие минимальные разности, которыми можно заменить числа в суммах так, чтобы сумма S3  увеличилась как можно меньше. При этом разности должны быть нечётными, чтобы изменять чётность сумм.

Рассмотрим 3 случая неподходящих сумм:

  • S1  чётна, S2  чётна
  • S1  нечётна, S2  чётна
  • S
 1  чётна, S
 2  нечётна

В первом случае будет идеально, если между суммами S1  и S2  будет любая нечётная разность между максимальным числом и средним числом. В таком случае можно будет их поменять местами, тогда обе суммы станут нечётны, не затрагивая сумму S3  .

Однако нужно учесть вариант, что такой разности может и не быть. Тогда рассмотрим, какие разности можно прибавить к минимальной сумме S3  . Будем расписывать подходящие для замены виды троек по остаткам максимального, среднего и минимального числа соответственно, то есть по их позициям 1, 2 и 3:

  • 0  0  1
  • 1  1  0

В таких тройках можно будет менять минимальное число и с максимальным, и со средним для изменения чётности. Но так как мы хотим увеличить сумму S3  как можно меньше, то будем делать в таких случаях замену только со средним числом. Тогда тройки изменятся на следующий вид:

  • 0  1  0
  • 1  0  1

Если сделать 1 такую замену, то сумма S2  станет нечётна, а также в такой тройке появится возможность поменять первое и второе число в этой тройке, так как их разность станет нечётна. В итоге, чтобы обе суммы стали нечётны, достаточно сделать в двух тройках замену среднего числа на минимальное. Тогда сумма S2  останется чётна (два раза изменили её остаток на 1), а также появятся две тройки с нечётными разностями для замены первого числа на второе. Таким образом, сделав замену только в одной из двух таких троек, получим нечётные суммы S1  и S2  .

Во втором случае сумму S1  уже трогать не нужно, нужно только сделать замену между суммами S2  и S3  , чтобы сумма S2  стала нечётна. Тогда подойдут тройки следующего вида, где x  – любой остаток:

  • x  1  0
  • x  0  1

То есть нужно сохранить все нечётные разности между средним и минимальным числом, чтобы только в одной тройке сделать замену минимальной разностью.

В третьем случае для идеальной замены распишем виды подходящих троек, где x  – любой остаток:

  • 1  x  0
  • 0  x  1

Среди них выделим тройки следующего вида:

  • 1  1  0
  • 0  0  1

В этих выделенных тройках, как в 1 случае, не важно, какую делать замену: менять максимальное на минимальное или среднее на минимальное. Если поменять минимальное со средним, то в итоге можно будет сделать замену между 2 и 3 по позициям числами, а далее между 1 и 2 по позициям числами в тройке. Таким образом, сумма S3  будет увеличена всего лишь на разность минимального и среднего числа, получая нечётные суммы S
 1  и S
 2  .

Если расписывать подробно, то будут произведены следующие замены попарно:

  • 1  1  0  1  0  1  0  1  1
  • 0  0  1  0  1  0  1  0  0

Если же тройки следующего вида:

  • 1  0  0
  • 0  1  1

То тогда можно сделать только замену между минимальным и максимальным числом.

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

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

mr12 = 0
mr23_110_001 = []  # Если r12 чётна, будем сохранять нечётные r23
mr13_100_011 = []  # Если r12 нечётна, будем сохранять нечётные r13
mr23_010_101 = []  # Если r12 нечётна, будем сохранять нечётные r23

s1 = 0  # Первая "нечётная" сумма
s2 = 0  # Вторая "нечётная" сумма
s3 = 0  # Третья минимальная сумма
for i in range(n):
    # Считывание чисел по возрастанию с помощью сортировки sorted()
    x, y, z = sorted(map(int, f.readline().split()))
    s1 += z  # Прибавляем максимальное число
    s2 += y  # Прибавляем среднее число
    s3 += x  # Прибавляем минимальное число

    r12 = z - y  # Разность для возможной перестановки ср. и макс. чисел
    r23 = y - x  # Разность для возможной замены ср. числа на мин. число
    r13 = z - x  # Разность для возможной замены макс. числа на мин. число

    if r12 % 2 == 1:  # Перестановка z,y в s1 и s2 поменяет чётность обеих сумм
        mr12 = r12
        if r13 % 2 == 1:
            mr13_100_011.append(r13)
        if r23 % 2 == 1:
            mr23_010_101.append(r23)
    elif r23 % 2 == 1:  # Заменять мин. число в таких тройках выгодно только на ср. число
        mr23_110_001.append(r23)

# Обе суммы не подходят, а разность mr12 не нашлась
if s1 % 2 == 0 and s2 % 2 == 0 and mr12 == 0:
    for _ in range(2):  # Берём разность 2 раза
        r = min(mr23_110_001)  # Берём минимальную разность
        mr23_110_001.remove(r)  # Убираем её из списка разностей
        s3 += r

# Только вторая сумма не подходит
elif s1 % 2 != 0 and s2 % 2 == 0:
    mr23_x10_x01 = mr23_010_101 + mr23_110_001  # Создаём обший список подходящих разностей
    r = min(mr23_x10_x01)  # Находим минимальную подходящую разность
                                                                                                  
                                                                                                  
    s3 += r

# Только первая сумма не подходит
elif s1 % 2 == 0 and s2 % 2 != 0:
    mr13_1x0_0x1 = mr13_100_011 + mr23_110_001  # Создаём обший список подходящих разностей
    r = min(mr13_1x0_0x1)  # Находим минимальную подходящую разность
    s3 += r

print(s3)

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

from itertools import permutations
f = open(’27b.txt’)
n = int(f.readline())
groupes = [[0,0,0]]
for t in f:
    new_groupes = []
    for last_groupe in groupes:
        s1,s2,s3 = last_groupe
        for a,b,c in permutations(list(map(int,t.split()))):
            new_groupes.append((s1+a,s2+b,s3+c) )
    groupes = {(x[1] % 2,x[2] % 2):x for x in sorted(new_groupes, reverse=True)}.values()
for s1,s2,s3 in groupes:
    if s2 % 2 != 0 and s3 % 2 != 0:
        print(s1)

Ответ: 1239 151970679

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

Задача 93#75186Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

4 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

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

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

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

print(s)

Ответ: 362409 226741314

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

Задача 94#75187Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

4 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

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

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

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

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

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

print(s)

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

f = open(’D:/5A.txt’)
n = int(f.readline())
# Список с суммами с разными остатками.
# Изначально суммы пустые.
m = [0]*11
for i in range(n):
    x, y, z = list(map(int, f.readline().split()))
    # Временный массив с суммами.
    m_new = [0] * 11
    # Перебор разных сумм со всеми числами из тройки.
    # Суммы будут сравниваться между собой посредством условий.
    for t in range(11):
        if m[t] + x > m_new[(m[t] + x) % 11]:
            m_new[(m[t] + x) % 11] = m[t] + x

        if m[t] + y > m_new[(m[t] + y) % 11]:
            m_new[(m[t] + y) % 11] = m[t] + y

        if m[t] + z > m_new[(m[t] + z) % 11]:
            m_new[(m[t] + z) % 11] = m[t] + z
    # Сохраняем получившийся массив в m
    m = m_new.copy()
# Просят максимальное, не кратное 11.
# Значит берём максимальное из m[1:]
print(max(m[1:]))

Ответ: 387573 226611667

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

Задача 95#75188Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

4 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

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

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

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

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

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

print(s)

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

f = open(’D:/6A.txt’)
n = int(f.readline())
# Список с суммами с разными остатками.
# Изначально суммы пустые.
m = [0]*100
for i in range(n):
    x, y, z = list(map(int, f.readline().split()))
    # Временный массив с суммами.
    m_new = [0] * 100
    # Перебор разных сумм со всеми числами из тройки.
    # Суммы будут сравниваться между собой посредством условий.
    for t in range(100):
        if m[t] + x > m_new[(m[t] + x) % 100]:
            m_new[(m[t] + x) % 100] = m[t] + x

        if m[t] + y > m_new[(m[t] + y) % 100]:
            m_new[(m[t] + y) % 100] = m[t] + y

        if m[t] + z > m_new[(m[t] + z) % 100]:
            m_new[(m[t] + z) % 100] = m[t] + z
    # Сохраняем получившийся массив в m
    m = m_new.copy()
# Просят максимальное, не кратное 100.
# Значит берём максимальное из m[1:]
print(max(m[1:]))

Ответ: 366535 249170878

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

Задача 96#75189Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

4 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

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

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

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

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

if s % 5 == 0:  # Если сумма по итогу оказалась кратна 5
    s += mr  # Прибавляем минимальную разность к минимальной сумме

print(s)

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

f = open(’D:/7A.txt’)
n = int(f.readline())
# Список с суммами с разными остатками.
# Изначально суммы пустые.
m = [0]*5
for i in range(n):

    x, y, z = list(map(int, f.readline().split()))
    # Временный массив с суммами.
    # Изначально выставляем большое значение,
    # чтобы в самом начале проставились суммы из m
    # вне зависимости от их значения.
    # Далее суммы будут сравниваться между собой посредством условий.
    m_new = [10**10] * 5
    # Перебор разных сумм со всеми числами из тройки
    for t in range(5):
        if m[t] + x < m_new[(m[t] + x) % 5]:
            m_new[(m[t] + x) % 5] = m[t] + x

        if m[t] + y < m_new[(m[t] + y) % 5]:
            m_new[(m[t] + y) % 5] = m[t] + y

        if m[t] + z < m_new[(m[t] + z) % 5]:
            m_new[(m[t] + z) % 5] = m[t] + z
    # Сохраняем получившийся массив в m
    m = m_new.copy()
# Просят минимальное, не кратное 5.
# Значит берём минимальное из m[1:]
print(min(m[1:]))

Ответ: 132597 101622939

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

Задача 97#75190Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

4 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

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

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

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

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

if s % 12 == 0:  # Если сумма по итогу оказалась кратна 12
    s += mr  # Прибавляем минимальную разность к минимальной сумме

print(s)

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

f = open(’D:/8A.txt’)
n = int(f.readline())
# Список с суммами с разными остатками.
# Изначально суммы пустые.
m = [0]*12
for i in range(n):
    x, y, z = list(map(int, f.readline().split()))
    # Временный массив с суммами.
    # Изначально выставляем большое значение,
    # чтобы в самом начале проставились суммы из m
    # вне зависимости от их значения.
    # Далее суммы будут сравниваться между собой посредством условий.
    m_new = [10**10] * 12
    # Перебор разных сумм со всеми числами из тройки
    for t in range(12):
        if m[t] + x < m_new[(m[t] + x) % 12]:
            m_new[(m[t] + x) % 12] = m[t] + x

        if m[t] + y < m_new[(m[t] + y) % 12]:
            m_new[(m[t] + y) % 12] = m[t] + y

        if m[t] + z < m_new[(m[t] + z) % 12]:
            m_new[(m[t] + z) % 12] = m[t] + z
    # Сохраняем получившийся массив в m
    m = m_new.copy()
# Просят минимальное, не кратное 12.
# Значит берём минимальное из m[1:]
print(min(m[1:]))

Ответ: 119202 180060349

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

Задача 98#75191Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

4 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

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

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

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

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

if s % 113 == 0:  # Если сумма по итогу оказалась кратна 113
    s += mr  # Прибавляем минимальную разность к минимальной сумме

print(s)

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

f = open(’D:/9B.txt’)
n = int(f.readline())
# Список с суммами с разными остатками.
# Изначально суммы пустые.
m = [0]*113
for i in range(n):
    x, y, z = list(map(int, f.readline().split()))
    # Временный массив с суммами.
    # Изначально выставляем большое значение,
    # чтобы в самом начале проставились суммы из m
    # вне зависимости от их значения.
    # Далее суммы будут сравниваться между собой посредством условий.
    m_new = [10**10] * 113
    # Перебор разных сумм со всеми числами из тройки
    for t in range(113):
        if m[t] + x < m_new[(m[t] + x) % 113]:
            m_new[(m[t] + x) % 113] = m[t] + x

        if m[t] + y < m_new[(m[t] + y) % 113]:
            m_new[(m[t] + y) % 113] = m[t] + y

        if m[t] + z < m_new[(m[t] + z) % 113]:
            m_new[(m[t] + z) % 113] = m[t] + z
    # Сохраняем получившийся массив в m
    m = m_new.copy()
# Просят минимальное, не кратное 113.
# Значит берём минимальное из m[1:]
print(min(m[1:]))

Ответ: 129044 125960361

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

Задача 99#75192Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 100000  ). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10 000.

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

6

8 3 4

4 8 12

9 5 6

2 8 3

12 3 5

7 4 12

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

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

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

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

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

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

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

print(s)

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

f = open(’D:/10B.txt’)
n = int(f.readline())
# Список с суммами с разными остатками.
# Изначально суммы пустые.
m = [0]*18
for i in range(n):
    x, y, z = list(map(int, f.readline().split()))
    # Временный массив с суммами.
    m_new = [0] * 18
    # Перебор разных сумм со всеми числами из тройки.
    # Суммы будут сравниваться между собой посредством условий.
    for t in range(18):
        if m[t] + x > m_new[(m[t] + x) % 18]:
            m_new[(m[t] + x) % 18] = m[t] + x

        if m[t] + y > m_new[(m[t] + y) % 18]:
            m_new[(m[t] + y) % 18] = m[t] + y

        if m[t] + z > m_new[(m[t] + z) % 18]:
            m_new[(m[t] + z) % 18] = m[t] + z
    # Сохраняем получившийся массив в m
    m = m_new.copy()
# Просят максимальное, не кратное 18.
# Значит берём максимальное из m[1:]
print(max(m[1:]))

Ответ: 364346 374945145

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

Задача 100#76586Максимум баллов за задание: 2

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

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество пар N (1 ≤ N ≤ 100000)  . Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.

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

6

1 3

5 11

6 9

5 4

3 3

1 1

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

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

Вложения к задаче
Показать ответ и решение
f = open(’1.txt’)
n = int(f.readline())
krat = 13
mr = [100000000500000000]*krat
s = 0
for i in range(n):
    a,b = map(int, f.readline().split())
    s += min(a, b)
    d = abs(a-b)
    mr1 = mr[:] #копия mr
    for j in range(krat):
        #берем разность и складываем с каждым элементом списка mr1
        #сравниваем получившуюся сумму с mr
        #если она меньше, то записываем данную сумму в mr
        if d + mr1[j] < mr[(d+mr[j]) % krat]:
            mr[(d+mr[j]) % krat] = d + mr1[j]
    #проверка, что если разность меньше соответствующего элемента в списке
    #то записываем эту разность в список
    if d < mr[d % krat]:
        mr[d % krat] = d

#Если сумма s не делится на krat, то сумма корректируется
#путем добавления значения из mr[krat - s % krat]
if s % krat != 0:
    s += mr[krat - s % krat]
print(s)

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