
Задача по теме: "Эффективное программирование"
Дана последовательность из N натуральных чисел. Рассматриваются все непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 157. Найдите среди них подпоследовательность с максимальной суммой, определите ее длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.
Входные данные:
Даны два входных файла (файл А и файл В), каждый из которых содержит в первой строке количество чисел 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('27v08_B.txt')# открываем файл
p = [int(x) for x in f]# читаем из файла всё
N = p[0]#количество элементов в массиве
k=157
del(p[0])# удаляем первый элемент массива
f.close()# закрываем файл
sum_max=0 # минимальной сумме присваиваем нижнее значение
lo=0 #длина подпоследовательности
so=0 # суммы непрерывных последовательностей
a=[0]*k# суммы с остатками от 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] #находим разницу кратную k
if d > sum_max:
lo = i - b[ost]# запоминаем ее длину
if d == sum_max:
lo = min (lo, i - b[ost]) #если последовательности имеют равные длины, находим наибольшей длины
sum_max = max(d, sum_max)
else:
a[ost] = so # сумма запоминается если не равна 0
b[ost] = i# запоминаем номер элемента
if ost == 0 and so > sum_max:
lo = i + 1
sum_max = so
print(lo)
Ответ: 601 1497991
Сообщение об ошибке
Расскажите, в каком месте допущена ошибка, мы как можно быстрее её исправим. Спасибо за обратную связь!
| МГ | Pro | ProMax | |
| Практика на платформе | |||
| Отслеживание прогресса обучения | |||
| Двухуровневое домашнее задание после каждого вебинара | |||
| Все материалы составлены экспертом ЕГЭ | |||
| Персональный менеджер | |||
| Личный куратор | |||
| Разбор ошибок личным куратором | |||
| Еженедельные созвоны с куратором для закрытия индивидуальных пробелов | |||
| Составление индивидуального расписания |
счёта
средств
подтверждено!
Теперь вы можете приступить
к следующему уроку
курса по математике
замены
Для смены номера телефона
мы отправили Вам код по СМС,
введите его в поле ниже.
Электронная почта
На почту придет чек об оплатеНажимая кнопку "купить", Вы выражаете своё согласие с офертой оказания услуг и принимаете их условия
Здравствуйте!
Выберите информацию о себе ниже
Оплата прошла успешно!