ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Пары и тройки в числовых данных.
| КЭС: | 3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве |
| Тип ответа: | Краткий ответ |
Ответ: 2781 85899
Решение.
В файле 6655 чисел, каждое записано в отдельной строке. Первое число — элемент последовательности, а не её длина. Рассматриваем только соседние тройки, сохраняя исходный порядок. Всего начальных позиций 6655 − 2 = 6653; соседние окна могут пересекаться.
Сначала среди всех чисел, запись которых оканчивается на 17, находим наибольшее. Условие окончания: остаток от деления |x| на 100 равен 17. Получаем m = 85917. Максимум выбирается из самих чисел x, со знаком; модуль используется только для проверки цифр.
Число содержит 3 цифры в записи модуля тогда и только тогда, когда 100 ≤ |x| < 1000. Знак минуса не считается цифрой. В каждой тройке подсчитываем такие элементы; требуется ровно 1. Затем для суммы s проверяем s < m.
Неравенство строгое, поэтому равенство порогу не подходит.
Для каждого подходящего окна увеличиваем счётчик на 1 и обновляем максимальную сумму. Перебор идёт по начальным позициям от 1 до 6653 включительно; ни одна допустимая соседняя тройка не пропускается и не проверяется дважды.
Сохраним приложенный текстовый файл под именем 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 == 17)
count = 0
best = None
for i in range(len(a) - 2):
w = a[i:i + 3]
s = sum(w)
if sum(100 <= abs(x) < 1000 for x in w) == 1 and s < m:
count += 1
if best is None or s > best:
best = s
print(count, best)Начальное best = None означает отсутствие найденного окна. Ноль не используется как искусственная начальная граница: реальные суммы могут иметь любой разрешённый условием знак. В данном файле подходящие окна существуют. Данные читаются за линейное время; основной цикл имеет постоянный размер окна, поэтому вся работа занимает O(n), память списка — O(n).
Проверка результата. Полный проход даёт 2781 подходящих окон. Максимальная сумма равна 85899. Контрольные окна с позициями, отсчитываемыми от 1:
| Начальная позиция | Элементы | Сумма |
|---|---|---|
| 6 | -83; -3478; 718 | -2843 |
| 7 | -3478; 718; -96 | -2856 |
| 6569 | -81; 613; 85367 | 85899 |
Окно с начальной позицией 6569 достигает найденного экстремума. Чисел нужной разрядности 1; 85899 < 85917. Таблица иллюстрирует результат; полноту количества и экстремума обеспечивает проверка всех начальных позиций, а не только этих примеров.
Ответ: 2781 85899.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF446B6B.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.