ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Электронные таблицы и формулы.
| КЭС: | 4.2 Анализ данных с помощью электронных таблиц. Вычисление суммы, среднего арифметического, наибольшего (наименьшего) значения диапазона. Вычисление коэффициента корреляции двух рядов данных. Построение столбчатых, линейчатых и круговых диаграмм. Построение графиков функций. Подбор линии тренда, решение задач прогнозирования. Решение задач оптимизации с помощью электронных таблиц 4.4 Вероятностные модели. Методы Монте-Карло. Имитационное моделирование. Системы массового обслуживания |
| Тип ответа: | Краткий ответ |
Ответ: 2396
Решение.
В приложенном файле 3200 строк по 4 натуральных чисел; первая строка уже содержит данные. Проверяем строки независимо и сохраняем их исходную нумерацию.
Для четырёх чисел после сортировки a ≤ b ≤ c ≤ d первое условие имеет вид d < a + b + c. Равенство не подходит. Проверяем только одно выбранное вхождение максимума; при совпадении значений остальные входят в сумму.
Для разбиения на пары равной суммы достаточно проверить a + d = b + c. Всего возможны три разбиения. Если равны a + b и c + d, то из порядка чисел следует равенство всех четырёх. Если равны a + c и b + d, то a = b и c = d. В обоих случаях также выполняется a + d = b + c. Обратное очевидно: пары (a, d) и (b, c) дают нужное разбиение.
Учитываем строку, если такого разбиения НЕ существует, то есть a + d ≠ b + c. Проверять лишь произвольную пару исходных столбцов было бы недостаточно.
Для воспроизводимого подсчёта сохраним заполненный лист как текст с разделителями табуляции под именем data.txt в кодировке UTF-8. Заголовок добавлять не нужно. При экспорте должны сохраниться все 3200 строк и все 4 чисел каждой строки. Метод split() разбирает как табуляции, так и пробелы.
Следующая программа проверяет оба требования для каждой строки:
from collections import Counter
answer = 0
with open("data.txt", encoding="utf-8-sig") as f:
for number, line in enumerate(f, 1):
a = sorted(map(int, line.split()))
c = Counter(a)
single = [x for x in a if c[x] == 1]
repeat = [x for x in a if c[x] > 1]
ok = (a[-1] < sum(a[:-1]) and a[0] + a[3] != a[1] + a[2])
if ok:
answer += 1
print(answer)Counter хранит частоту каждого значения. Оператор and означает одновременное выполнение условий; если проверка частот не прошла, второе выражение не вычисляется.
Каждая строка учитывается не более одного раза. Полный проход даёт 2396 подходящих строк.
Контроль нескольких найденных строк:
| Номер строки | Значения |
|---|---|
| 1 | 7, 84, 97, 23 |
| 3 | 29, 47, 5, 24 |
| 4 | 79, 60, 84, 44 |
| 3199 | 48, 17, 85, 23 |
| 3200 | 6, 54, 53, 39 |
Например, строка 1: Максимум 97 меньше суммы остальных 114. Суммы крайних и средних: 104 и 107.
Проверка выполнена также по исходному XLSX: независимый алгоритм подсчёта частот совпал по всем выбранным номерам строк.
Ответ: 2396.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFC2ECD2.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.