ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Пары и тройки в числовых данных.
| КЭС: | 3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве |
| Тип ответа: | Краткий ответ |
Ответ: 68 306
Решение.
В файле 6703 чисел, каждое записано в отдельной строке. Первое число — элемент последовательности, а не её длина. Рассматриваем только соседние тройки, сохраняя исходный порядок. Всего начальных позиций 6703 − 2 = 6701; соседние окна могут пересекаться.
Сначала среди всех чисел, запись которых оканчивается на 33, находим наибольшее. Условие окончания: остаток от деления |x| на 100 равен 33. Получаем m = 99033. Максимум выбирается из самих чисел x, со знаком; модуль используется только для проверки цифр.
Число содержит 2 цифры в записи модуля тогда и только тогда, когда 10 ≤ |x| < 100. Знак минуса не считается цифрой. В каждой тройке подсчитываем такие элементы; требуется ровно 2. Затем для суммы s проверяем s² < m.
Неравенство строгое, поэтому равенство порогу не подходит. Возводим в квадрат сумму всех трёх чисел, а не складываем их квадраты. Для итогового максимума сохраняем саму сумму s, со знаком.
Для каждого подходящего окна увеличиваем счётчик на 1 и обновляем максимальную сумму. Перебор идёт по начальным позициям от 1 до 6701 включительно; ни одна допустимая соседняя тройка не пропускается и не проверяется дважды.
Сохраним приложенный текстовый файл под именем data.txt рядом с программой. Программа на Python:
with open("data.txt", encoding="utf-8-sig") as f:
a = [int(x) for x in f.read().split()]
m = max(x for x in a if abs(x) % 100 == 33)
count = 0
best = None
for i in range(len(a) - 2):
w = a[i:i + 3]
s = sum(w)
if sum(10 <= abs(x) < 100 for x in w) == 2 and s * s < m:
count += 1
if best is None or s > best:
best = s
print(count, best)Начальное best = None означает отсутствие найденного окна. Ноль не используется как искусственная начальная граница: реальные суммы могут иметь любой разрешённый условием знак. В данном файле подходящие окна существуют. Данные читаются за линейное время; основной цикл имеет постоянный размер окна, поэтому вся работа занимает O(n), память списка — O(n).
Проверка результата. Полный проход даёт 68 подходящих окон. Максимальная сумма равна 306. Контрольные окна с позициями, отсчитываемыми от 1:
| Начальная позиция | Элементы | Сумма |
|---|---|---|
| 41 | -97; -89; 275 | 89 |
| 83 | -83; 448; -92 | 273 |
| 308 | 325; 80; -99 | 306 |
Окно с начальной позицией 308 достигает найденного экстремума. Чисел нужной разрядности 2; (306)² = 93636 < 99033. Таблица иллюстрирует результат; полноту количества и экстремума обеспечивает проверка всех начальных позиций, а не только этих примеров.
Ответ: 68 306.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF1F0F94.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.