ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Электронные таблицы и формулы.
| КЭС: | 4.2 Анализ данных с помощью электронных таблиц. Вычисление суммы, среднего арифметического, наибольшего (наименьшего) значения диапазона. Вычисление коэффициента корреляции двух рядов данных. Построение столбчатых, линейчатых и круговых диаграмм. Построение графиков функций. Подбор линии тренда, решение задач прогнозирования. Решение задач оптимизации с помощью электронных таблиц |
| Тип ответа: | Краткий ответ |
Ответ: 1980
Решение.
В исходной таблице 28000 строк данных, в каждой 5 натуральных чисел. Первая строка данных имеет номер 1, заголовка нет. Порядок строк сохраняем: сортировка всей таблицы изменила бы их номера.
Сначала проверяем, что все пять чисел различны. Множество set(row) оставляет по одному экземпляру каждого значения, поэтому это условие равносильно len(set(row)) = 5. Если найден повтор, строка сразу не подходит.
Обозначим минимум строки через m, максимум через M, сумму всех пяти чисел через S. Сумма остальных трёх равна S − m − M. Второе условие записывается как 2 · (m + M) > S − m − M; после переноса оно равносильно 3 · (m + M) > S.
Используем строгое сравнение «больше». Равенство не подходит. Минимум и максимум — по одному числу; все числа различны, поэтому вычитание m и M из общей суммы оставляет именно три нужных числа.
Просматриваем строки сверху вниз. Для первой подходящей строки вычисляем сумму всех пяти чисел и останавливаемся. В ответ требуется именно эта сумма, а не номер строки и не сумма номеров подходящих строк.
Для программы скопируйте только исходный диапазон A1:E28000 в текстовый файл 9.txt в кодировке UTF-8: одна строка таблицы — одна строка текста, числа разделены пробелами, табуляцией или точкой с запятой. Не добавляйте заголовок и не меняйте порядок строк. Исходный ODS можно сохранить отдельно.
Программа на Python:
answer = None
with open("9.txt", encoding="utf-8-sig") as f:
for number, line in enumerate(f, 1):
row = list(map(int, line.replace(';', ' ').split()))
assert len(row) == 5
different = len(set(row)) == 5
balance = 3 * (min(row) + max(row)) > sum(row)
if different and balance:
answer = sum(row)
break
print(answer)Оба условия выполняются в 4874 строках. Первый подходящий номер — 11, последний — 27992. Для требуемой величины получаем 1980.
Проверка строки 11: числа 23, 216, 41, 970, 730. Все пять различны. Минимум 23, максимум 970, сумма 1980; 2 · (23 + 970) = 1986 > 987, где 987 — сумма остальных трёх.
Независимый проход сравнивал числа попарно для проверки различия, а затем проверял исходное неравенство. Совпали не только ответы, но и все номера подходящих строк.
Все 10 предыдущих строк не удовлетворяют хотя бы одному условию. Поэтому выбор первой подходящей строки обоснован полным просмотром предшествующего участка.
На одну строку приходится постоянное число действий: в ней всегда четыре или пять чисел. Время O(N), дополнительная память O(1), поскольку весь файл одновременно в память не загружается.
Ответ: 1980.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF8089D6.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.