Подтема 4 из 6
Две группы чисел
Повторяющиеся и одиночные числа: их суммы и средние — и ответ задачи темы.
Две группы
Решим задачу темы целиком. Структура подходит у строк 1, 2, 5 и 6 — осталось сравнить среднее неповторяющихся с суммой повторяющихся.
Числа строки делят на две группы — неповторяющиеся (частота 1) и повторяющиеся (частота больше 1) — и сравнивают их суммы, количества или средние.
| Строка | Неповторяющиеся | Пара | O > 4P |
|---|---|---|---|
| 1 | 5, 7, 9, 11 — сумма 32 | 2, 2 — сумма 4 | 32 > 16, да |
| 2 | 1, 3, 7, 9 — сумма 20 | 5, 5 — сумма 10 | 20 > 40, нет |
| 5 | 4, 5, 7, 8 — сумма 24 | 3, 3 — сумма 6 | 24 > 24, нет |
| 6 | 20, 22, 24, 26 — сумма 92 | 7, 7 — сумма 14 | 92 > 56, да |
Подходят первая и шестая строки — ответ задачи темы 2. Заметь: у четвёртой строки 2, 2, 2, 7, 9, 11 сравнение тоже выполнено (27 > 24), но структура не та — поэтому сначала проверяют структуру.
Суммы групп
В таблице сумму группы складывает СУММЕСЛИ по полосе частот, в Python группы собирают в два списка.
проверяет условие в одном диапазоне и складывает числа из другого: =СУММЕСЛИ(G1:L1; — посмотреть частоты в G1:L1, выбрать позиции с частотой 1 и сложить числа на этих позициях из A1:F1. Условие ">1" в кавычках выбирает повторяющиеся:
=СЧЁТЕСЛИ($A1:$F1; A1)=СУММЕСЛИ(G1:L1; 1; A1:F1)=СУММЕСЛИ(G1:L1;">1"; A1:F1)=ЕСЛИ(И(СЧЁТЕСЛИ(G1:L1; 2)=2;СЧЁТЕСЛИ(G1:L1; 1)=4; M1>4*N1); 1; 0)Отметка в O соединяет структуру и сравнение. Формулы протягивают вниз и складывают отметки:
| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 2 | 5 | 7 | 9 | 11 | 2 | 2 | 1 | 1 | 1 | 1 | 32 | 4 | 1 |
| 2 | 5 | 5 | 1 | 3 | 7 | 9 | 2 | 2 | 1 | 1 | 1 | 1 | 20 | 10 | 0 |
| 3 | 2 | 2 | 5 | 5 | 9 | 11 | 2 | 2 | 2 | 2 | 1 | 1 | 20 | 14 | 0 |
| 4 | 2 | 2 | 2 | 7 | 9 | 11 | 3 | 3 | 3 | 1 | 1 | 1 | 27 | 6 | 0 |
| 5 | 3 | 3 | 4 | 5 | 7 | 8 | 2 | 2 | 1 | 1 | 1 | 1 | 24 | 6 | 0 |
| 6 | 7 | 7 | 20 | 22 | 24 | 26 | 2 | 2 | 1 | 1 | 1 | 1 | 92 | 14 | 1 |
| 7 | 2 |
G1скопирована до L6=СЧЁТЕСЛИ($A1:$F1;A1) M1скопирована до M6=СУММЕСЛИ(G1:L1;1; A1:F1) N1скопирована до N6=СУММЕСЛИ(G1:L1;">1";A1:F1) O1скопирована до O6=ЕСЛИ(И(СЧЁТЕСЛИ(G1:L1;2)=2;СЧЁТЕСЛИ(G1:L1; 1)=4; M1>4*N1); 1; 0) O7=СУММ(O1:O6)
Таблица широкая — прокрути её вправо. Поменяй 8 в пятой строке на 9 — сумма одиночных станет 25 > 24, и строка начнёт подходить.
Пустой список — [], .append(x) в конец. Пройди по шагам, куда попадает каждое число первой строки:
a = [2, 2, 5, 7, 9, 11]single = []repeated = []for x in a: if a.count(x) == 1: single.append(x) else: repeated.append(x)print(single, repeated)В else («иначе») попадают числа с частотой больше 1: частота числа из строки не бывает нулевой. Короче те же списки собирает . Структуру удобно проверить по длинам групп: в строке из шести чисел одна пара и четыре одиночных — это ровно 4 неповторяющихся и 2 повторяющихся.
answer = 0with open("9.txt") as f: for line in f: a = [int(part) for part in line.split()] single = [x for x in a if a.count(x) == 1] repeated = [x for x in a if a.count(x) > 1] if len(single) == 4 and len(repeated) == 2: if sum(single) > 4 * sum(repeated): answer += 1print(answer)Два вложенных if проверяют условия по очереди: сначала структуру, потом сравнение. Такую программу проще проверить по частям, чем одно длинное условие.
Средние групп
Средние двух групп сравнивают произведениями: сумма одной группы на количество чисел другой. В строке 2, 2, 5, 5, 5, 9 одно неповторяющееся число (сумма 9) и пять повторяющихся (сумма 19): 9 · 5 = 45 > 19 · 1 = 19 — среднее неповторяющихся больше.
Количество чисел группы в таблице даёт =СЧЁТЕСЛИ(G1:L1; или =СЧЁТЕСЛИ(G1:L1;, в Python — списка:
a = [2, 2, 5, 5, 5, 9]single = [x for x in a if a.count(x) == 1]repeated = [x for x in a if a.count(x) > 1]print(sum(single) * len(repeated), sum(repeated) * len(single))Сначала проверяют структуру, потом средние и наибольшие числа групп: структура гарантирует, что обе группы непустые. У пустого списка нет ни среднего, ни максимума — max([]) остановит программу ошибкой, а в таблице деление на ноль даст #ДЕЛ/0!.
Тонкости:повторяющиеся без учёта повторений
«Сумма повторяющихся чисел без учёта повторений» берёт каждое значение один раз: для 2, 2, 5, 5, 5 это 2 + 5 = 7, а с учётом всех появлений — 19. В Python такую сумму даёт множество группы.
repeated = [2, 2, 5, 5, 5]print(sum(repeated), sum(set(repeated)))Делить сумму повторяющихся на 2 можно, только если каждое значение встречается ровно дважды: 4, 4, 7, 7 → 22 / 2 = 11. Для 4, 4, 7, 7, 7 это уже неверно.
Чётные и нечётные
В строке 1, 3, 5, 20, 30 нечётных чисел больше, чем чётных. А чья сумма больше?
Чётные и нечётные числа — тоже две группы: их делят по остатку от деления на 2. Чётное число делится на 2 без остатка. Количество и сумма группы — независимые условия: нечётных три, но их сумма 9 меньше суммы чётных 50.
даёт остаток. Полоса остатков в G1:L1 работает как полоса частот: СЧЁТЕСЛИ считает чётные, СУММЕСЛИ складывает их:
=ОСТАТ(A1; 2)=СЧЁТЕСЛИ(G1:L1; 0)=СУММЕСЛИ(G1:L1; 0; A1:F1)Остаток в Python — : x % 2 == 0 — чётное, x % 2 != 0 — нечётное.
a = [1, 3, 5, 20, 30]even = [x for x in a if x % 2 == 0]odd = [x for x in a if x % 2 != 0]print(even, odd)print(len(odd) > len(even), sum(odd) < sum(even))Тонкости:«выше среднего» и ноль
Число выше среднего строки, если x > S / n, то есть n · x > S — снова без деления. Слова «выше среднего» относятся только к той части условия, где они стоят: если количества сравнивают среди чисел выше среднего, а суммы — по всей строке, для сумм берут все числа.
a = [1, 3, 5, 20, 30]print([x for x in a if len(a) * x > sum(a)])Ноль чётный: 0 % 2 == 0. Для отрицательных чисел проверка тоже работает: -7 % 2 в Python равно 1.
Итого
- Две группычастота 1 и частота больше 1
- СУММЕСЛИ
=СУММЕСЛИ(G1:L1;, для повторяющихся1; A1:F1) ">1" - Два списка
[x for x in a if a.count(x) == 1] - Средниесначала структура, потом S₁ · k₂ > S₂ · k₁
- Чётность
x % 2 == 0,=ОСТАТ(A1;2)
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
A1:F1, их частоты — в G1:L1. Запиши формулу суммы неповторяющихся чисел.ОтветСкрыть ответ
=СУММЕСЛИ(G1:L1; 1; A1:F1): выбрать позиции с частотой 1 и сложить числа на этих позициях.ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Среднее повторяющихся меньше
Сколько строк учебной таблицы 9.txt содержат и повторяющиеся, и неповторяющиеся числа, причём среднее повторяющихся (с учётом повторений) меньше среднего неповторяющихся?
Введите число.
Подсказка
Средние двух групп сравни произведениями: сумма одной группы на количество чисел другой.
Решение
Обе группы есть во всех строках учебной таблицы. Сравниваем средние без деления: сумма повторяющихся на количество неповторяющихся против суммы неповторяющихся на количество повторяющихся. Только во второй строке средние равны (5 и 5), поэтому подходит 5 строк.
Решение программой
answer = 0with open("9.txt") as f: for line in f: a = [int(part) for part in line.split()] repeated = [x for x in a if a.count(x) > 1] single = [x for x in a if a.count(x) == 1] smaller = ( sum(repeated) * len(single) < sum(single) * len(repeated) ) if repeated and single and smaller: answer += 1print(answer)Ответ: 5
Тройка и три одиночных
В каждой строке таблицы 9-3.xlsx, 9-3.txt записаны шесть натуральных чисел. Определи количество строк, в которых одно число встречается трижды, остальные три числа различны, а повторяющееся число не меньше среднего арифметического трёх неповторяющихся.
Введите число.
Подсказка
Сначала проверь структуру, затем умножь сравнение со средним на 3.
Решение
Сначала структура 3 + 1 + 1 + 1, затем сравнение без деления: повторяющееся число x не меньше среднего трёх одиночных, то есть 3x ≥ сумма одиночных. Подходит 85 строк.
Решение программой
from collections import Counter answer = 0with open("9-3.txt") as f: for line in f: a = [int(part) for part in line.split()] counts = Counter(a) repeated = [x for x in a if counts[x] > 1] single = [x for x in a if counts[x] == 1] shape = sorted(counts.values()) if ( shape == [1, 1, 1, 3] and 3 * repeated[0] >= sum(single) ): answer += 1print(answer)Ответ: 85
Наименьшие двух групп
В каждой строке таблицы 9-4.xlsx, 9-4.txt записаны семь натуральных чисел. Определи количество строк, в которых одно число встречается трижды, другое — дважды, остальные различны, а наименьшее из повторяющихся чисел больше наименьшего из неповторяющихся.
Введите число.
Подсказка
Сначала проверь структуру: только тогда обе группы точно непустые.
Решение
Пока структура не проверена, одной из групп может не быть — поэтому сначала 3 + 2 + 1 + 1, затем min(repeated) > min(single). Подходит 44 строки.
Решение программой
from collections import Counter answer = 0with open("9-4.txt") as f: for line in f: a = [int(part) for part in line.split()] counts = Counter(a) repeated = [x for x in a if counts[x] > 1] single = [x for x in a if counts[x] == 1] shape = sorted(counts.values()) if ( shape == [1, 1, 2, 3] and min(repeated) > min(single) ): answer += 1print(answer)Ответ: 44
Различные повторяющиеся значения
Для таблицы 9-3.xlsx, 9-3.txt определи количество строк, в которых два числа встречаются по два раза, два — по одному, а сумма повторяющихся чисел без учёта повторений (каждое значение один раз) больше суммы неповторяющихся.
Введите число.
Подсказка
«Без учёта повторений» — каждое повторяющееся значение берут один раз.
Решение
Структура 2 + 2 + 1 + 1. «Без учёта повторений» — каждое повторяющееся значение один раз: sum(set(repeated)). Здесь можно и разделить сумму повторяющихся на 2: каждое значение встречается ровно дважды. Подходит 74 строки.
Решение программой
from collections import Counter answer = 0with open("9-3.txt") as f: for line in f: a = [int(part) for part in line.split()] counts = Counter(a) repeated = [x for x in a if counts[x] > 1] single = [x for x in a if counts[x] == 1] shape = sorted(counts.values()) if ( shape == [1, 1, 2, 2] and sum(set(repeated)) > sum(single) ): answer += 1print(answer)Ответ: 74
Остаток отрицательного числа
Чему равно -7 % 2 в Python?
Введите число.
Подсказка
Остаток от деления на 2 в Python — 0 или 1, даже у отрицательного числа.
Решение
В Python остаток от деления на положительное число неотрицателен: −7 = 2 · (−4) + 1, остаток 1. Поэтому проверка нечётности x % 2 != 0 работает и для отрицательных чисел.
Решение программой
print(-7 % 2)Ответ: 1
Чётных больше, сумма нечётных больше
В каждой строке таблицы 9-5.xlsx, 9-5.txt записаны восемь натуральных чисел. Определи количество строк, в которых чётных чисел больше, чем нечётных, а сумма нечётных чисел больше суммы чётных.
Введите число.
Подсказка
Раздели строку на чётные и нечётные: сравниваются и количества, и суммы групп.
Решение
Чётные и нечётные — две группы по остатку от деления на 2. Сравниваем их длины и суммы: len(even) > len(odd) and sum(odd) > sum(even). Подходит 19 строк.
Решение программой
answer = 0with open("9-5.txt") as f: for line in f: a = [int(part) for part in line.split()] even = [x for x in a if x % 2 == 0] odd = [x for x in a if x % 2 != 0] if len(even) > len(odd) and sum(odd) > sum(even): answer += 1print(answer)Ответ: 19
Заметные числа
Для таблицы 9-5.xlsx, 9-5.txt назовём число строки заметным, если оно строго больше среднего арифметического всех чисел строки. Определи количество строк, в которых заметных нечётных чисел больше, чем заметных чётных, а сумма всех чётных чисел строки больше суммы всех её нечётных.
Введите число.
Подсказка
Заметность проверяй как n · x > S; суммы считай по всем числам строки, а не только по заметным.
Решение
Число заметно, если n · x > S — без деления. Количества сравниваются среди заметных чисел, а суммы — по всем чётным и нечётным числам строки. Подходит 24 строки.
Решение программой
answer = 0with open("9-5.txt") as f: for line in f: a = [int(part) for part in line.split()] n = len(a) s = sum(a) even = [x for x in a if x % 2 == 0] odd = [x for x in a if x % 2 != 0] even_big = [x for x in even if n * x > s] odd_big = [x for x in odd if n * x > s] if ( len(odd_big) > len(even_big) and sum(even) > sum(odd) ): answer += 1print(answer)Ответ: 24