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

08 Макс/мин, кол-во пар, сумма/разность/произведение кратно/не кратно на расстоянии

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

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности, в которых между любыми двумя элементами расстояние не менее 45 (расстояние – разность порядковых номеров). Необходимо определить максимальную сумму элементов пары, кратную 1234.

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

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

Переборное решение:

f = open(’A.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = -10 ** 10

k = 1234  # Чему должна быть кратна сумма
s = 45  # Расстояние между элементами

for i in range(n):
    for j in range(i + 1, n):
        if (a[i] + a[j]) % k == 0 and j - i >= s:
            ans = max(ans, a[i] + a[j])

print(ans)

Эффективное решение:

f = open(’B.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = -10 ** 10

k = 1234  # Чему должна быть кратна сумма
s = 45  # Расстояние между элементами

# Список максимальных чисел с определенными остатками от деления на k
# Например, под индексом 3 хранится максимальное число с остатком 3
nums = [-10 ** 10] * k

for i in range(s, n):
    # Считаем остаток от деления первого числа пары на k
    ost1 = a[i - s] % k
    # Обновляем максимум по остатку
    nums[ost1] = max(nums[ost1], a[i - s])

    # Считаем остаток, который должен быть у числа,
    # которое можно поставить в пару с текущим
    ost2 = (k - (a[i] % k)) % k
    # Обновляем ответ, если он больше предыдущего
    ans = max(ans, a[i] + nums[ost2])

print(ans)

Ответ: 1931210 1999080

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности, в которых между любыми двумя элементами расстояние не менее 38 (расстояние – разность порядковых номеров). Необходимо определить максимальную разность элементов пары, кратную 456 (под разностью понимать вычитание из элемента, находящегося позже в последовательности, того элемента, который встречается раньше в последовательности).

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

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

Переборное решение:

f = open(’A.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = -10 ** 10

k = 456  # Чему должна быть кратна сумма
s = 38  # Расстояние между элементами

for i in range(n):
    for j in range(i + 1, n):
        if (a[j] - a[i]) % k == 0 and j - i >= s:
            ans = max(ans, a[j] - a[i])

print(ans)

Эффективное решение:

f = open(’2_27B_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 38
k = 456
# Список из минимальных чисел с определенным остатком от деления
t = [10 ** 10] * k
mx = -1
for i in range(d, len(a)):
    # Обрабатываем элемент на расстоянии d от текущего
    ost1 = a[i - d] % k
    # Если он меньше прошлого с таким остатком - обновляем список
    t[ost1] = min(t[ost1], a[i - d])

    # Вычисляем остаток для пары нашего числа
    ost2 = a[i] % k
    # Если уже нашлось число с таким остатком - считаем разность и обновляем максимум
    if t[ost2] < 10 ** 10:
        rz = a[i] - t[ost2]
        if rz > mx:
            mx = rz

print(mx)

Ответ: 917472 999552

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности, в которых между любыми двумя элементами расстояние не менее 67 (расстояние – разность порядковых номеров). Необходимо определить максимальную разность элементов пары, кратную 876 (под разностью понимать любую положительную разность между любыми двумя подходящими под условие элементами последовательности).

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

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

Переборное решение:

f = open(’A.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = -10 ** 10

k = 876  # Чему должна быть кратна сумма
s = 67  # Расстояние между элементами

for i in range(n):
    for j in range(i + 1, n):
        if abs((a[j] - a[i])) % k == 0 and j - i >= s:
            ans = max(ans, abs(a[j] - a[i]))

print(ans)

Эффективное решение:

f = open(’3_27B_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 67
k = 876
# Список из минимальных чисел с определенным остатком от деления
tmn = [10 ** 10] * k
# Список из максимальных чисел с определенным остатком от деления
tmx = [-1] * k
mx = -1
for i in range(d, len(a)):
    # Обрабатываем элемент на расстоянии d от текущего
    ost1 = a[i - d] % k
    # Если он меньше прошлого с таким остатком - обновляем список минимумов
    tmn[ost1] = min(tmn[ost1], a[i - d])
    # Если он больше прошлого с таким остатком - обновляем список максимумов
    tmx[ost1] = max(tmx[ost1], a[i - d])

    # Вычисляем остаток для пары нашего числа
    ost2 = a[i] % k
    # Если уже нашлось минимальное число с таким остатком - считаем разность и обновляем максимум
    if tmn[ost2] < 10 ** 10:
        rz = a[i] - tmn[ost2]
        if rz > mx:
            mx = rz
    # Если уже нашлось максимальное число с таким остатком - считаем разность и обновляем максимум
    if tmx[ost2] > -1:
        rz = tmx[ost2] - a[i]
        if rz > mx:
            mx = rz

print(mx)

Ответ: 951336 999516

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности, в которых между любыми двумя элементами расстояние не менее 100 (расстояние – разность порядковых номеров). Необходимо определить минимальную сумму элементов пары, кратную 5693.

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

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

Переборное решение:

f = open(’A.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = 10 ** 10

k = 5693  # Чему должна быть кратна сумма
s = 100  # Расстояние между элементами

for i in range(n):
    for j in range(i + 1, n):
        if (a[i] + a[j]) % k == 0 and j - i >= s:
            ans = min(ans, a[i] + a[j])

print(ans)

Эффективное решение:

f = open(’4_27A_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 100
k = 5693
# Список из минимальных чисел с определенным остатком от деления
t = [10 ** 10] * k
mn = 10 ** 10
for i in range(d, len(a)):
    # Обрабатываем элемент на расстоянии d от текущего
    ost1 = a[i - d] % k
    # Если он меньше прошлого с таким остатком - обновляем список
    t[ost1] = min(t[ost1], a[i - d])

    # Вычисляем остаток для пары нашего числа
    ost2 = (k - (a[i] % k)) % k
    # Если уже нашлось число с таким остатком - считаем и обновляем минимум
    if t[ost2] < 10 ** 10:
        sm = a[i] + t[ost2]
        if sm < mn:
            mn = sm

print(mn)

Ответ: 153711 5693

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности, в которых между любыми двумя элементами расстояние не более 28 (расстояние – разность порядковых номеров). Необходимо определить максимальную сумму элементов пары, кратную 777.

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

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

Переборное решение:

f = open(’A.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = -10 ** 10

k = 777  # Чему должна быть кратна сумма
s = 28  # Расстояние между элементами

for i in range(n):
    for j in range(i + 1, n):
        if (a[j] + a[i]) % k == 0 and j - i <= s:
            ans = max(ans, a[i] + a[j])

print(ans)

Эффективное решение:

f = open(’5_27B_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 28
k = 777
# Список из элементов на нужном расстоянии
lst = []
mx = -1
for i in range(len(a)):
    # Считываем текущий элемент
    a1 = a[i]
    # Проходимся по d элементов до текущего
    for a2 in lst:
        # Если сумма удовлетворяет условию - обновляем максимум
        if (a1 + a2) % k == 0:
            mx = max(mx, a1 + a2)
    # Добавляем текущий элемент в массив
    lst.append(a1)
    # Убираем элемент, который будет слишком далеко для нового элемента
    if len(lst) > d:
        lst.pop(0)

print(mx)

Ответ: 1929291 1994559

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности, в которых между любыми двумя элементами расстояние не более 59 (расстояние – разность порядковых номеров). Необходимо определить минимальную кратную 689 сумму элементов пары, имеющих одинаковые первые две цифры.

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

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

Переборное решение:

f = open(’A.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = 10 ** 10

k = 689  # Чему должна быть кратна сумма
s = 59  # Расстояние между элементами

for i in range(n):
    for j in range(i + 1, n):
        if (a[j] + a[i]) % k == 0 and j - i <= s and str(a[i])[:2] == str(a[j])[:2]:
            ans = min(ans, a[i] + a[j])

print(ans)

Эффективное решение:

f = open(’6_27A_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 59
k = 689
# Список из элементов на нужном расстоянии
lst = []
mn = 10 ** 10
for i in range(len(a)):
    # Считываем текущий элемент
    a1 = a[i]
    # Проходимся по d элементов до текущего
    for a2 in lst:
        # Если сумма удовлетворяет условию - обновляем минимум
        if (a1 + a2) % k == 0 and str(a1)[:2] == str(a2)[:2]:
            mn = min(mn, a1 + a2)
    # Добавляем текущий элемент в массив
    lst.append(a1)
    # Убираем элемент, который будет слишком далеко для нового элемента
    if len(lst) > d:
        lst.pop(0)

print(mn)

Ответ: 247351 50986

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности, в которых между любыми двумя элементами расстояние не менее 70 (расстояние – разность порядковых номеров). Необходимо определить максимальную сумму кратную 7654 элементов пары, имеющих одинаковые остатки от деления на 3.

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

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

Переборное решение:

f = open(’A.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = -10 ** 10

k = 7654  # Чему должна быть кратна сумма
s = 70  # Расстояние между элементами

for i in range(n):
    for j in range(i + 1, n):
        if (a[i] + a[j]) % k == 0 and a[i] % 3 == a[j] % 3 and j - i >= s:
            ans = max(ans, a[i] + a[j])

print(ans)

Эффективное решение:

f = open(’7_27A_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 70
k = 7654
r = 3
# Список из максимальных чисел с определенным остатком от деления
t = [[-1] * k for i in range(r)]
mx = -1
for i in range(d, len(a)):
    # Обрабатываем элемент на расстоянии d от текущего
    ost1 = a[i - d] % k
    ost1_1 = a[i - d] % r
    # Если он больше прошлого с таким остатком - обновляем список
    t[ost1_1][ost1] = max(t[ost1_1][ost1], a[i - d])

    # Вычисляем остаток для пары нашего числа
    ost2 = (k - (a[i] % k)) % k
    ost2_1 = a[i] % r
    # Если уже нашлось число с таким остатком - считаем и обновляем минимум
    if t[ost2_1][ost2] > -1:
        sm = a[i] + t[ost2_1][ost2]
        if sm > mx:
            mx = sm

print(mx)

Ответ: 1630302 1997694

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются тройки различных элементов последовательности, в которых между любыми двумя элементами расстояние не менее 35 (расстояние – разность порядковых номеров). Необходимо определить максимальную сумму такой тройки, кратную 937.

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

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

Переборное решение:

f = open(’A.txt’)

n = int(f.readline())
a = [int(i) for i in f]
ans = 0

k = 937  # Чему должна быть кратна сумма
s = 35  # Расстояние между элементами

for i in range(n):
    for j in range(i + 1, n):
        for r in range(j + 1, n):
            if j - i >= s and r - j >= s and (a[i] + a[j] + a[r]) % k == 0:
                ans = max(ans, a[i] + a[j] + a[r])

print(ans)

Эффективное решение:

f = open(’8_27A_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 35
k = 937
# Список из максимальных чисел с определенным остатком от деления
t = [-1] * k
# Список из пар с максимальными суммами c определенным остатком
v = [[-1, -1] for i in range(k)]
mx = -1
for i in range(d * 2, len(a)):
    # Обрабатываем элемент на расстоянии 2*d от текущего
    ost1 = a[i - d * 2] % k
    # Если он больше прошлого с таким остатком - обновляем список
    t[ost1] = max(t[ost1], a[i - d * 2])

    # Обрабатываем средний элемент - на расстоянии d от текущего
    ost2 = a[i - d] % k
    # Для каждого из максимальных первых элементов (для каждого остатка)
    # создаём новые суммы с новым средним элементом и обновляем
    # эти суммы в списке v, если они получились больше прошлых
    for j in range(k):
        if t[j] > -1:
            sm_pair = t[j] + a[i - d]
            if sm_pair > sum(v[(j + ost2) % k]):
                v[(j + ost2) % k] = [t[j], a[i - d]]

    # Вычисляем остаток для пары в сумму к нашему числу
    ost3 = (k - (a[i] % k)) % k
    # Если уже нашлось число с таким остатком - считаем и обновляем максимум
    if sum(v[ost3]) > -1:
        sm = a[i] + sum(v[ost3])
        if sm > mx:
            mx = sm

print(mx)

Ответ: 2597364 2999337

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются тройки различных элементов последовательности, в которых между любыми двумя элементами расстояние не менее 85 (расстояние – разность порядковых номеров). Необходимо определить минимальную сумму такой тройки, кратную 555.

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

Вложения к задаче
Показать ответ и решение
f = open(’9_27A_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 85
k = 555
# Список из минимальных чисел с определенным остатком от деления
t = [10 ** 10] * k
# Список из пар с минимальными суммами c определенным остатком
v = [[10 ** 10, 10 ** 10] for i in range(k)]
mn = 10 ** 10
for i in range(d * 2, len(a)):
    # Обрабатываем элемент на расстоянии 2*d от текущего
    ost1 = a[i - d * 2] % k
    # Если он больше прошлого с таким остатком - обновляем список
    t[ost1] = min(t[ost1], a[i - d * 2])

    # Обрабатываем средний элемент - на расстоянии d от текущего
    ost2 = a[i - d] % k
    # Для каждого из максимальных первых элементов (для каждого остатка)
    # создаём новые суммы с новым средним элементом и обновляем
    # эти суммы в списке v, если они получились больше прошлых
    for j in range(k):
        if t[j] < 10 ** 10:
            sm_pair = t[j] + a[i - d]
            if sm_pair < sum(v[(j + ost2) % k]):
                v[(j + ost2) % k] = [t[j], a[i - d]]

    # Вычисляем остаток для пары в сумму к нашему числу
    ost3 = (k - (a[i] % k)) % k
    # Если уже нашлось число с таким остатком - считаем и обновляем максимум
    if sum(v[ost3]) < 10 ** 10:
        sm = a[i] + sum(v[ost3])
        if sm < mn:
            mn = sm

print(mn)

Ответ: 51060 555

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

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

На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются тройки различных элементов последовательности, в которых между любыми двумя элементами расстояние не менее 99 (расстояние – разность порядковых номеров). Необходимо определить максимальную сумму такой тройки, кратную 123. Причём каждый элемент тройки должен делиться на 3 без остатка.

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

Вложения к задаче
Показать ответ и решение
f = open(’10_27B_pairs.txt’)
n = int(f.readline())
a = [int(i) for i in f]
d = 99
k = 123
# Список из максимальных чисел с определенным остатком от деления
t = [-1] * k
# Список из пар с максимальными суммами c определенным остатком
v = [[-1, -1] for i in range(k)]
mx = -1
for i in range(d * 2, len(a)):
    if a[i - d * 2] % 3 == 0:
        # Обрабатываем элемент на расстоянии 2*d от текущего
        ost1 = a[i - d * 2] % k
        # Если он больше прошлого с таким остатком - обновляем список
        t[ost1] = max(t[ost1], a[i - d * 2])

    if a[i - d] % 3 == 0:
        # Обрабатываем средний элемент - на расстоянии d от текущего
        ost2 = a[i - d] % k
        # Для каждого из максимальных первых элементов (для каждого остатка)
        # создаём новые суммы с новым средним элементом и обновляем
        # эти суммы в списке v, если они получились больше прошлых
        for j in range(k):
            if t[j] > -1:
                sm_pair = t[j] + a[i - d]
                if sm_pair > sum(v[(j + ost2) % k]):
                    v[(j + ost2) % k] = [t[j], a[i - d]]
    if a[i] % 3 == 0:
        # Вычисляем остаток для пары в сумму к нашему числу
        ost3 = (k - (a[i] % k)) % k
        # Если уже нашлось число с таким остатком - считаем и обновляем максимум
        if sum(v[ost3]) > -1:
            sm = a[i] + sum(v[ost3])
            if sm > mx:
                mx = sm

print(mx)

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