ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Электронные таблицы и формулы.
| КЭС: | 4.2 Анализ данных с помощью электронных таблиц. Вычисление суммы, среднего арифметического, наибольшего (наименьшего) значения диапазона. Вычисление коэффициента корреляции двух рядов данных. Построение столбчатых, линейчатых и круговых диаграмм. Построение графиков функций. Подбор линии тренда, решение задач прогнозирования. Решение задач оптимизации с помощью электронных таблиц |
| Тип ответа: | Краткий ответ |
Ответ: 4868
Решение.
В исходной таблице 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 = 0
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 += 1
print(answer)Оба условия выполняются в 4868 строках. Первый подходящий номер — 1, последний — 27997. Для требуемой величины получаем 4868.
Проверка строки 1: числа 168, 71, 85, 246, 328. Все пять различны. Минимум 71, максимум 328, сумма 898; 2 · (71 + 328) = 798 > 499, где 499 — сумма остальных трёх.
Независимый проход сравнивал числа попарно для проверки различия, а затем проверял исходное неравенство. Совпали не только ответы, но и все номера подходящих строк.
На одну строку приходится постоянное число действий: в ней всегда четыре или пять чисел. Время O(N), дополнительная память O(1), поскольку весь файл одновременно в память не загружается.
Ответ: 4868.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINF4DE1C2.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.