Teacher & coder

Задача № 184

Компания, ведущая мониторинг линии электропередач, получила N числовых значений измерений высоты растений (в мм) вдоль этой линии, которые выполнялись последовательно друг за другом.

Высоту растений с точки зрения безопасности линии электропередач оценивают на основе анализа сумм всех возможных непрерывных подпоследовательностей полученных числовых значений, среди которых требуется выбрать подпоследовательность с максимальной суммой, кратной k = 137. Среди таких непрерывных подпоследовательностей необходимо выбрать подпоследовательность с наибольшим количеством элементов, то есть ту, в которой суммируются числовые значения высот наибольшего количества растений. В ответе укажите её длину.

Входные данные

Дано два входных файла (файл А и файл В), каждый из которых в первой строке содержит число N \((1 \leqslant N \leqslant 10 000 000)\) - количество измерений высоты растений (в мм). Каждая из следующих N строк содержит одно натуральное число, не превышающее 10 000 - числовое значение одного результата измерения.

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

Типовой пример организации данных во входном файле

7
100
300
400
9300
800
500
9500

При таких исходных данных при k = 5000 искомая максимальная сумма составляет 300 + 400 + 9300 или 500 + 9500 и равна 10000; ответом на вопрос задачи является число 3.

Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемых файлов.

Файлы к заданию
Можно скопировать и вставить все ответы сразу
ЕГКР 27 апреля 2024 года (Московский пробник)
Прокрути, чтобы прочитать решение задачи
Ты уверен, что хочешь это сделать?
Удачного чтения!

Решение

Код из видео

# открываем файл B
file = open('27-B.txt')

# считываем первую строку
N = int(file.readline())

# по условию
k = 137

# максимальный ответ
# сначала сумма, затем количество
maxA = (0, 0)
# общая сумма и количество
s = count = 0
# словарь с остатками: алгоритм префиксной суммы
# для кратных числе ничего уменьшать не будет: по умолчанию нули
ost = { 0:(0, 0) }

# перебираем строки
for line in file:
    # преобразуем каждую строку в число
    num = int(line)
    # увеличиваем общую сумму и количество
    s += num
    count += 1

    # находим подходящий остаток или сохраняем текущий
    ost[s % k] = ost.get(s % k, (s, count))
    # делим остаток на сумму и количество
    ostS, ostC = ost[s % k]

    # находим максимум: сначала сравниваем суммы,
    # а при их равестве по количеству
    maxA = max(maxA, (s - ostS, count - ostC))

# в ответе только количество
print(maxA[-1])

Артём Зинкин

Лучше не гуглить и подумать самостоятельно. Тест можно пройти несколько раз :)
Чтобы поделиться задачей с коллегами или друзьями, отправьте им ссылку :)
Забыл сказать, что у этой задачи есть подробное решение. Посмотрите его :)
Попробуйте решить эту задачу сами и посмотрите наши разборы похожих задач :)
Кстати, на ЕГЭ тоже нельзя копировать :)
Этим материалом удобно поделиться по прямой ссылке :)