Задание EGEINF8C5A88: Пары и тройки в числовых данных

ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий

Открыть решение ↓ Ошибка или пожелание

Тип задачи: Пары и тройки в числовых данных.

Учебные темы: Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве.

Впишите правильный ответ.

Рисунок из условия ФИПИ

Задание выполняется с использованием прилагаемых файлов.

В файле содержится последовательность целых чисел. Её элементы могут принимать целые значения от –100 000 до 100 000 включительно. Определите количество троек последовательности, в которых все числа одного знака, при этом произведение минимального и максимального элементов тройки больше квадрата минимального элемента последовательности, который оканчивается на 15 и является трёхзначным числом. В ответе запишите количество найденных троек чисел, затем минимальное из произведений максимального и минимального элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.

Скачать файл задания (TXT, ФИПИ)


i
СВОЙСТВА ЗАДАНИЯ
КЭС:
3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве
Тип ответа:Краткий ответ
Номер: 8C5A88
НЕ РЕШЕНО Ответить

Решение задания EGEINF8C5A88

Ответ: 3507 863808

Решение.
Используем исходный текстовый файл задания. В нём записаны сами элементы последовательности; отдельного числа с её длиной в начале файла нет. Сохраните файл рядом с программой под именем 1_17.txt.
Сначала находим минимальный элемент M, который является трёхзначным и оканчивается на 15. Для отрицательных чисел рассматриваем запись без знака: 100 ≤ |x| ≤ 999 и |x| mod 100 = 15.
В исходном файле N = 10080, искомый минимум M = -915. Следовательно, порог M² = 837225. Отрицательное число −915 подходит, а его квадрат положителен. Проверка x mod 100 = 15 без модуля x неверно обрабатывала бы отрицательные числа.
Просматриваем все N − 2 = 10078 последовательных троек. Пусть L — минимальный, H — максимальный элемент текущей тройки. Все три числа одного знака тогда и только тогда, когда L > 0 или H < 0. Ноль не является ни положительным, ни отрицательным числом.
Оставляем тройку, если дополнительно L · H > M². Неравенство строгое: равенство порогу не подходит. Для каждой такой тройки увеличиваем счётчик и обновляем минимальное произведение.
Контрольная тройка с минимальным произведением начинается с позиции 7696, если считать позиции с 1: −192, −296, −4499. Все числа отрицательны. Минимум L = −4499, максимум H = −192; важно не перепутать обычный порядок отрицательных чисел с порядком их модулей.
L · H = (−4499) · (−192) = 863808 > 837225. Таким образом, эта тройка проходит отбор и достигает найденного минимума.
Программа на Python:

with open('1_17.txt', encoding='utf-8-sig') as f:
    a = [int(s) for s in f.read().split()]

limit = min(x for x in a if 100 <= abs(x) <= 999 and abs(x) % 100 == 15)
count = 0
best = None
for i in range(len(a) - 2):
    triple = a[i:i + 3]
    low, high = min(triple), max(triple)
    product = low * high
    if (low > 0 or high < 0) and product > limit * limit:
        count += 1
        if best is None or product < best:
            best = product
print(count, best)

Результат запуска на исходном файле: 3507 863808.
Получено 3507 подходящих троек.
Проверка полноты. Цикл посещает каждую допустимую начальную позицию ровно один раз, включая первую и последнюю. После каждой итерации счётчик равен числу подходящих уже просмотренных окон, а best хранит нужное крайнее значение среди них. Обновление выполняется только после проверки всех требований, поэтому итог учитывает в точности нужные окна.
Время работы линейно по числу элементов: один просмотр для порога и один для окон. Список a занимает O(N) памяти; дополнительные переменные требуют O(1).
Ответ: 3507 863808.

Помочь улучшить сайт

Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF8C5A88.

Сообщение увидит только команда сайта: на странице оно не публикуется.

Комментарии к решению

Комментарии видны всем посетителям сайта.

Комментариев пока нет. Будьте первым.

Чтобы оставить комментарий, войдите или зарегистрируйтесь.