Необходимо выбрать такую подпоследовательность подряд идущих чисел
Условие
На вход программы поступает последовательность из целых положительных чисел. Необходимо выбрать такую подпоследовательность подряд идущих чисел, чтобы их сумма была максимальной и делилась на 89, а также её длину. Если таких подпоследовательностей несколько, выбрать такую, у которой длина меньше.
Входные данные.
Файл AФайл BДаны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (2 ≤ N ≤ 68000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10000. Программа должна вывести длину найденной последовательности.
Пример входного файла:8234934234595Для делителя 50 при указанных входных данных значением искомой суммы должно быть число 100 (3 + 4 + 93 или 5 + 95). Следовательно, ответ на задачу — 2. В ответе укажите два числа: сначала значение искомой длины для файла A, затем для файла B. Ответ:
Ответ
Ответ и полный разбор откроются после входа
Посмотреть ответРешение по шагам
Как рассуждать
Решение. Перебираем все возможные суммы, которые начинаются на i-том элементе и заканчиваются на j-том элементе. Нашли бОльшую сумму — обновили ms (макс. сумму) и m (мин. длину). Нашли такую же сумму, как уже найденная максимальная, — обновили m при необходимости. Приведём переборное решение задачи на языке Python.f = open('27_B.txt')n = int(f.readline())nums = list(map(int, f.readlines()[:n]))m, ms = float('inf'), 0for i in range(len(nums)): for j in range(i, len(nums)): s = sum(nums[i:j + 1]) if s % 89 == 0 and s > ms: ms, m = s, j - i + 1 if s % 89 == 0 and s == ms: m = min(m, j - i + 1)print(m) Приведём динамическое решение задачи на языке Python.f = open('27_B.txt')k, s = 89, 0mins = {0: (0, 0)}res = []for i in range(1, int(f.readline())+1): s += int(f.readline()) if s % k in mins: res += [(s - mins[s % k][0], mins[s % k][1] - i)] else: mins[s % k] = (s, i)print(-max(res)[1]) Приведём решение задачи через метод частичных сумм на языке Python.f = open('27_B.txt') n = int(f.readline())k = 89r = {0: (0, 0)}ms = 0m = float('inf')for _ in range(n): x = int(f.readline()) t = {} for key in r: t[(key+x) % k] = (r[key][0] + x, r[key][1] +
Осталось ещё 3 шага
if x % k not in t: t[x % k] = (x…
r = t.copy() if 0 in r: if ms < r[0][0]: ms =…
Примечание. Путь к файлу необходимо указать…
Бесплатно · займёт минуту