ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Электронные таблицы и формулы.
| КЭС: | 4.2 Анализ данных с помощью электронных таблиц. Вычисление суммы, среднего арифметического, наибольшего (наименьшего) значения диапазона. Вычисление коэффициента корреляции двух рядов данных. Построение столбчатых, линейчатых и круговых диаграмм. Построение графиков функций. Подбор линии тренда, решение задач прогнозирования. Решение задач оптимизации с помощью электронных таблиц |
| Тип ответа: | Краткий ответ |
Ответ: 29968
Решение.
В исходной таблице 30000 строк данных, в каждой 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:E30000 в текстовый файл 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 = number
print(answer)Оба условия выполняются в 521 строках. Первый подходящий номер — 177, последний — 29968. Для требуемой величины получаем 29968.
Проверка строки 29968: числа 5, 53, 59, 79, 80. Все пять различны. Минимум 5, максимум 80, сумма 276; 2 · (5 + 80) = 170 < 191, где 191 — сумма остальных трёх.
Независимый проход сравнивал числа попарно для проверки различия, а затем проверял исходное неравенство. Совпали не только ответы, но и все номера подходящих строк.
После строки 29968 проверены ещё 32 строки: ни одна не удовлетворяет обоим условиям. Это подтверждает, что выбран наибольший номер.
На одну строку приходится постоянное число действий: в ней всегда четыре или пять чисел. Время O(N), дополнительная память O(1), поскольку весь файл одновременно в память не загружается.
Ответ: 29968.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFFE0870.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.