
Задача по теме: "Эффективное программирование"
Дана последовательность из N натуральных чисел. Рассматриваются все непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 123. Найдите среди них подпоследовательность с минимальной суммой, определите ее длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой длинной из них.
Входные данные:
Даны два входных файла (файл А и файл В), каждый из которых содержит в первой строке количество чисел N (1<=N<=10 000 000). Каждая из следующих N строк содержит одно натуральное число, не превышающее 10 000.
В ответе укажите два числа: сначала значение искомой величины для файла A, а затем для файла B.
Пример организации во входном файле:
7
1
3
4
193
8
5
195
Для указанных входных данных при k=100 искомая длина последовательности равна 3.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемых файлов.
Предупреждение: для обработки файла В не следует использовать переборный алгоритм для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго.
Решение:
Для решения этого задания нужно написать на языке программирования Python код для сортировки значений:
f=open('27v05_A.txt') # открываем файл
p = [int(x) for x in f] # читаем из файла всё
N = p[0] #количество элементов в массиве
k=123
del(p[0])# удаляем первый элемент массива
f.close() # закрываем файл
sum_min=10000000 # минимальной сумме присваиваем верхнее значение
lo=0 #длина подпоследовательности
so=0 # суммы непрерывных последовательностей
a=[0]*k # суммы с одинаковыми остатками
b=[0]*k # длины подпоследовательностей с одинаковыми остатками
for i in range(N):
so += p[i] # накапливаем сумму
ost = so % k # находим остаток от деления данной суммы на k
if a[ost] != 0:
d = so - a[ost] #находим разницу между текущим s и суммой с таким же остатком
if d < sum_min:
lo = i - b[ost] # запоминаем ее длину
if d == sum_min:
lo = max (lo, i - b[ost]) #если последовательности имеют равные длины, находим наибольшей длины
sum_min = min(sum_min, d) # ищем минимальную сумму
elif ost == 0 and so < sum_min:# если последовательность начинается с нулевого элемента
lo = i + 1 # длина на 1 больше
sum_min = so
a[ost] = so # запоминаем текущее значение суммы
b[ost] = i# запоминаем номер элемента
print(lo)
Ответ: 1 3
Сообщение об ошибке
Расскажите, в каком месте допущена ошибка, мы как можно быстрее её исправим. Спасибо за обратную связь!
| МГ | Pro | ProMax | |
| Практика на платформе | |||
| Отслеживание прогресса обучения | |||
| Двухуровневое домашнее задание после каждого вебинара | |||
| Все материалы составлены экспертом ЕГЭ | |||
| Персональный менеджер | |||
| Личный куратор | |||
| Разбор ошибок личным куратором | |||
| Еженедельные созвоны с куратором для закрытия индивидуальных пробелов | |||
| Составление индивидуального расписания |
счёта
средств
подтверждено!
Теперь вы можете приступить
к следующему уроку
курса по математике
замены
Для смены номера телефона
мы отправили Вам код по СМС,
введите его в поле ниже.
Электронная почта
На почту придет чек об оплатеНажимая кнопку "купить", Вы выражаете своё согласие с офертой оказания услуг и принимаете их условия
Здравствуйте!
Выберите информацию о себе ниже
Оплата прошла успешно!