ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Пары и тройки в числовых данных.
| КЭС: | 3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве |
| Тип ответа: | Краткий ответ |
Ответ: 2688 98608
Решение.
В файле 6640 чисел. Тройка — только три соседних элемента; произвольные сочетания из файла не рассматриваем. Соседние тройки могут иметь общие элементы, и каждая проверяется отдельно.
Сначала по всей последовательности находим M — наибольшее значение среди чисел, десятичная запись которых оканчивается на 13. Проверка окончания: abs(x) % 100 == 13. Модуль нужен только для цифр записи; сам максимум берём по исходным значениям, сохраняя знак. Из файла получаем M = 98613.
Число имеет 2 цифр тогда и только тогда, когда 10 ≤ |x| < 100. Знак минуса не является цифрой, а правая граница не включается. В каждой тройке считаем k — количество элементов с таким числом цифр. По условию требуется ровно одно: проверяем k == 1.
После проверки количества цифр находим обычную сумму трёх исходных чисел S, с их знаками. Второе условие: S ≤ M. Равенство допускается. Если обе проверки пройдены, увеличиваем счётчик и обновляем наибольшую подходящую сумму. Начальное значение максимума — None, чтобы не предполагать положительность ответа.
Все начала троек имеют индексы от 0 до N − 3 включительно. Поэтому range(len(a) - 2) проверяет каждую тройку ровно один раз и не выходит за конец файла.
Программа Python; data.txt — исходный текстовый файл из архива:
with open("data.txt", encoding="utf-8-sig") as f:
a = list(map(int, f.read().split()))
M = max(x for x in a if abs(x) % 100 == 13)
count = 0
best = None
for i in range(len(a) - 2):
triple = a[i:i + 3]
k = sum(10 <= abs(x) < 100 for x in triple)
total = sum(triple)
if k == 1 and total <= M:
count += 1
if best is None or total > best:
best = total
print(count, best)Получаем 2688 подходящих троек; наибольшая сумма равна 98608.
Проверка максимума. В тройке с первым элементом на позиции 4102 (нумерация от 1) стоят числа 89605, 8909, 94. Их сумма 89605 + 8909 + 94 = 98608. Эта тройка удовлетворяет обоим условиям. Независимый проход по всем окнам подтвердил и количество, и максимальную сумму; существование одного примера не заменяет полный перебор.
Сложность двух проходов линейная по количеству чисел; внутри каждой тройки выполняется постоянное число операций.
Ответ: 2688 98608.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF5994E6.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.