Подтема 2 из 6
Сумма, наибольшее и наименьшее
Наибольшие и наименьшие числа строки, сумма остальных, пары и средние — без деления.
Два наибольших
В каких строках учебной таблицы сумма двух наибольших чисел не больше суммы остальных?
Числа по величине берут из упорядоченной копии строки: последнее — наибольшее, предпоследнее — второе по величине. Повторы при этом сохраняются: у строки 9, 3, 9, 5 упорядоченная копия 3, 5, 9, 9, и второе по величине — тоже 9, а не 5.
В пятой строке 3, 3, 4, 5, 7, 8 два наибольших — 8 и 7, их сумма 15, а сумма остальных 3 + 3 + 4 + 5 = 15: «не больше» выполнено. В шестой 26 + 24 = 50 и 7 + 7 + 20 + 22 = 56 — тоже подходит. В остальных строках два наибольших больше: в первой 11 + 9 = 20 > 16. Ответ — 2 строки.
=НАИБОЛЬШИЙ(A1:F1; даёт k-е по величине число строки, считая с наибольшего, =НАИМЕНЬШИЙ(A1:F1; — с наименьшего. Строку при этом не сортируют:
=НАИБОЛЬШИЙ(A1:F1; 1)+НАИБОЛЬШИЙ(A1:F1; 2)=ЕСЛИ(G1<=СУММ(A1:F1)-G1; 1; 0) возвращает новый список по возрастанию, исходный a не меняется. -1 — последний элемент, -2 — предпоследний:
a = [3, 3, 4, 5, 7, 8]b = sorted(a)print(b)print(b[-1] + b[-2], sum(a) - b[-1] - b[-2])a = [9, 3, 9, 5]b = sorted(a)print(a, b)print(b[-1], b[-2], b[0], b[1])Тонкости:когда сортировать нельзя
Сортировка теряет исходный порядок. Если условие говорит о первом или последнем числе, о первых четырёх столбцах или о возрастании слева направо, нужна исходная строка — поэтому сортируют копию. Запись a.sort(), в отличие от sorted(a), меняет сам список.
В электронной таблице нельзя сортировать отдельные столбцы независимо: числа разных строк перемешаются, и проверяться будут уже другие строки.
Сумма остальных
Сумму остальных получают вычитанием: без наибольшего — S − M, без наименьшего и наибольшего — S − m − M. Здесь S — сумма строки, m — наименьшее, M — наибольшее число. Условие «наибольшее число меньше суммы остальных» — это M < S − M.
При повторах вычитание убирает одно наименьшее и одно наибольшее число. Для строки 2, 2, 5, 9, 9: S = 27, S − m − M = 27 − 2 − 9 = 16 — это 2 + 5 + 9. Убрать все двойки и девятки — другая операция, останется только 5.
=МАКС(A1:E1)<СУММ(A1:E1)-МАКС(A1:E1)=СУММ(A1:E1)-МИН(A1:E1)-МАКС(A1:E1)a = [2, 2, 5, 9, 9]print(sum(a) - max(a), sum(a) - min(a) - max(a))print(max(a) < sum(a) - max(a))Тонкости:три числа как стороны треугольника
Три положительных числа — стороны треугольника, если сумма двух меньших больше наибольшего: после упорядочивания a ≤ b ≤ c это a + b > c. Без сортировки то же самое — сумма остальных больше наибольшего: S − M > M, то есть S > 2M. Остальные неравенства треугольника выполняются сами: короткая сторона всегда меньше суммы двух других.
Вид треугольника решает знак разности a² + b² − c² для упорядоченных сторон: больше нуля — остроугольный, ноль — прямоугольный, меньше нуля — тупоугольный. Для тупоугольного сначала проверяют, что треугольник существует: у чисел 1, 2, 10 разность тоже отрицательна.
for a in [[4, 6, 10], [7, 4, 5], [5, 3, 4]]: b = sorted(a) d = b[0] ** 2 + b[1] ** 2 - b[2] ** 2 print(b, sum(a) > 2 * max(a), d)Пары с равными суммами
Можно ли числа 7, 3, 8, 4 разбить на две пары с равными суммами?
Четыре числа разбиваются на две пары с равными суммами, только если после упорядочивания сумма крайних равна сумме средних. Упорядочим: 3, 4, 7, 8. Крайние 3 + 8 = 11, средние 4 + 7 = 11 — можно.
Упорядоченная строка помогает и с арифметической прогрессией — числами с равными разностями соседей, как 2, 5, 8, 11. Если в условии сказано «после упорядочивания образуют прогрессию», сравнивают разности соседей упорядоченной копии.
Упорядоченные числа ставят во вспомогательные столбцы функцией НАИМЕНЬШИЙ с k = 1, 2, 3, 4. Столбец I проверяет прогрессию, J — пары:
| A | B | C | D | E | F | G | H | I | J | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 11 | 2 | 8 | 5 | 2 | 5 | 8 | 11 | ИСТИНА | ИСТИНА |
| 2 | 7 | 3 | 8 | 4 | 3 | 4 | 7 | 8 | ЛОЖЬ | ИСТИНА |
| 3 | 1 | 2 | 3 | 8 | 1 | 2 | 3 | 8 | ЛОЖЬ | ЛОЖЬ |
E1скопирована до E3=НАИМЕНЬШИЙ($A1:$D1;1) F1скопирована до F3=НАИМЕНЬШИЙ($A1:$D1;2) G1скопирована до G3=НАИМЕНЬШИЙ($A1:$D1;3) H1скопирована до H3=НАИМЕНЬШИЙ($A1:$D1;4) I1скопирована до I3=И(F1-E1=G1-F1;G1-F1=H1-G1) J1скопирована до J3=E1+H1=F1+G1
for a in [[7, 3, 8, 4], [1, 2, 3, 8]]: b = sorted(a) print(b, b[0] + b[3] == b[1] + b[2])Обоснование · необязательноПочему достаточно сравнить крайние и средние
Разбить четыре числа a ≤ b ≤ c ≤ d на две пары можно тремя способами: a, b и c, d; a, c и b, d; a, d и b, c. Если a + b = c + d, то меньшие числа сравнялись с большими — это возможно, только когда все четыре равны, и тогда a + d = b + c тоже верно. Если a + c = b + d, то (b − a) + (d − c) = 0, оба слагаемых неотрицательны, значит a = b и c = d, и снова a + d = b + c.
Чётности суммы недостаточно: у 1, 2, 3, 8 сумма 14 чётная, но пар с суммой 7 нет.
Квадрат суммы
Квадрат суммы и сумма квадратов — разные числа: сначала сложить и возвести в квадрат или возвести каждое и сложить. (3 + 5)² = 64, а 3² + 5² = 34.
Условие «квадрат суммы наименьшего и наибольшего больше суммы квадратов остальных» — это (m + M)² > Q − m² − M², где Q — сумма квадратов всей строки.
Сумму квадратов даёт СУММКВ, степень — знак ^:
=(МИН(A1:F1)+МАКС(A1:F1))^2>СУММКВ(A1:F1)-МИН(A1:F1)^2-МАКС(A1:F1)^2Степень в Python — ; знак ^ здесь означает другую операцию:
a = [2, 5, 7, 10]q = sum([x ** 2 for x in a])print(sum(a) ** 2, q, q - min(a) ** 2 - max(a) ** 2)Средние без деления
Вторая проверка задачи темы: среднее неповторяющихся больше суммы повторяющихся. Как записать её без деления?
Среднее сравнивают без деления: обе части неравенства умножают на количество чисел. Неповторяющихся чисел в подходящей строке ровно четыре. Если их сумма O, а сумма пары P, то O / 4 > P — то же, что O > 4P. Для пятой строки 24 > 4 · 6 = 24 неверно — тот же ответ, что и с делением, но без дробей.
Два средних сравнивают так же: S₁ / k₁ > S₂ / k₂ — то же, что S₁ · k₂ > S₂ · k₁. Например, среднее двух чисел с суммой 18 и среднее трёх чисел с суммой 24: 18 · 3 = 54 > 24 · 2 = 48, первое больше. Просто сравнивать суммы можно, только если чисел в группах поровну. И обе группы должны быть непустыми: у пустой группы среднего нет.
single = [4, 5, 7, 8]pair = [3, 3]print(sum(single) / len(single), sum(pair))print(sum(single) > len(single) * sum(pair))В таблице то же сравнение — =M1>4*N1, если в M1 сумма неповторяющихся, а в N1 — сумма пары (подтема 4). Скрытое среднее переводят так же: «наибольшее больше среднего пяти остальных более чем в три раза» — M > 3 · (S − M) / 5, то есть 5M > 3(S − M).
Тонкости:целая часть среднего и квадраты чисел
Целая часть среднего натуральных чисел — sum(a) // len(a), в таблице — ЦЕЛОЕ(СРЗНАЧ(A1:G1)). Есть ли такое число в строке, проверяет .
Число x — квадрат натурального числа, если isqrt(x) ** 2 == x: isqrt из модуля даёт целую часть квадратного корня — у 81 и у 82 это 9, но 9² = 81.
from math import isqrta = [2, 8, 4, 9, 11, 13, 12]print(sum(a) // len(a), sum(a) // len(a) in a)print([x for x in a if isqrt(x) ** 2 == x])Итого
- По величине
sorted(a)[-2],НАИБОЛЬШИЙ(…;2)— с повторами - Сумма остальныхS − M, S − m − M — по одному экземпляру
- Парыпосле упорядочивания a + d = b + c
- Квадраты(a + b)² ≠ a² + b²
- СредниеS₁ · k₂ > S₂ · k₁, группы непустые
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Второе по величине
Найди второе наибольшее число строки 4, 9, 9, 6.
Введите число.
Подсказка
Упорядочи строку: повторяющееся число занимает два места.
Решение
Упорядоченная строка — 4, 6, 9, 9. Повторяющаяся девятка занимает два последних места, поэтому второе наибольшее — тоже 9, а не 6.
Решение программой
a = [4, 9, 9, 6]b = sorted(a)print(b[-2])Ответ: 9
Сумма остальных при повторах
Для строки 3, 3, 8, 10, 10 найди S − m − M — сумму без одного наименьшего и одного наибольшего числа.
Введите число.
Подсказка
S − m − M убирает по одному наименьшему и наибольшему числу, а не все равные им.
Решение
S = 3 + 3 + 8 + 10 + 10 = 34. S − m − M убирает одну тройку и одну десятку: 34 − 3 − 10 = 21, это 3 + 8 + 10. Если бы убрали все тройки и десятки, осталось бы только 8 — это другая операция.
Решение программой
a = [3, 3, 8, 10, 10]print(sum(a) - min(a) - max(a))Ответ: 21
Прямоугольный треугольник
В каждой строке таблицы 9-9.xlsx, 9-9.txt записаны три натуральных числа. Определи, сколько троек могут быть сторонами прямоугольного треугольника.
Введите число.
Подсказка
Упорядочи тройку и сравни сумму квадратов двух меньших чисел с квадратом наибольшего.
Решение
После упорядочивания сторон a ≤ b ≤ c тройка — стороны прямоугольного треугольника, если a² + b² = c². Равенство само обеспечивает существование треугольника. Таких строк 30.
Решение программой
answer = 0with open("9-9.txt") as f: for line in f: a = [int(part) for part in line.split()] b = sorted(a) if b[0] ** 2 + b[1] ** 2 == b[2] ** 2: answer += 1print(answer)Ответ: 30
Тупоугольный треугольник
Для таблицы 9-9.xlsx, 9-9.txt определи, сколько троек могут быть сторонами тупоугольного треугольника.
Введите число.
Подсказка
Сначала проверь, что треугольник существует, потом сравни квадраты.
Решение
Тупоугольный треугольник — это два условия: треугольник существует (сумма двух меньших сторон больше наибольшей, или S > 2M) и a² + b² < c² для упорядоченных сторон. Без первого условия засчитались бы тройки вроде 1, 2, 10. Таких строк 270.
Решение программой
answer = 0with open("9-9.txt") as f: for line in f: a = [int(part) for part in line.split()] b = sorted(a) if ( b[0] + b[1] > b[2] and b[0] ** 2 + b[1] ** 2 < b[2] ** 2 ): answer += 1print(answer)Ответ: 270
Арифметическая прогрессия
В каждой строке таблицы 9-7.xlsx, 9-7.txt записаны четыре натуральных числа. Определи количество строк, в которых все числа различны и после упорядочивания образуют арифметическую прогрессию.
Введите число.
Подсказка
Упорядочи копию строки и сравни разности соседних чисел; не забудь, что числа различны.
Решение
Упорядоченная копия строки должна иметь равные разности соседей, а все четыре числа — быть различными: len(set(a)) == 4. Без этого прошли бы строки из четырёх одинаковых чисел. Подходит 40 строк.
Решение программой
answer = 0with open("9-7.txt") as f: for line in f: a = [int(part) for part in line.split()] b = sorted(a) if ( len(set(a)) == 4 and b[1] - b[0] == b[2] - b[1] == b[3] - b[2] ): answer += 1print(answer)Ответ: 40
Две пары, но не прогрессия
Для таблицы 9-7.xlsx, 9-7.txt определи количество строк, числа которых можно разбить на две пары с равными суммами, но которые после упорядочивания не образуют арифметическую прогрессию.
Введите число.
Подсказка
Сравни сумму крайних и сумму средних упорядоченной строки; прогрессии подходят под это всегда — исключи их.
Решение
Пары с равными суммами есть, если после упорядочивания сумма крайних равна сумме средних: b[0] + b[3] == b[1] + b[2]. Каждая прогрессия этому тоже удовлетворяет, поэтому её исключают отдельно. Подходит 60 строк.
Решение программой
answer = 0with open("9-7.txt") as f: for line in f: a = [int(part) for part in line.split()] b = sorted(a) progression = b[1] - b[0] == b[2] - b[1] == b[3] - b[2] if b[0] + b[3] == b[1] + b[2] and not progression: answer += 1print(answer)Ответ: 60
Квадрат суммы и сумма квадратов
На сколько квадрат суммы чисел 3 и 6 больше суммы их квадратов?
Введите число.
Подсказка
В квадрате суммы сначала складывают, в сумме квадратов сначала возводят в квадрат.
Решение
Квадрат суммы: сначала сложить, потом возвести — (3 + 6)² = 81. Сумма квадратов: сначала возвести каждое — 9 + 36 = 45. Разница 81 − 45 = 36 — это удвоенное произведение 2 · 3 · 6.
Решение программой
print((3 + 6) ** 2 - (3 ** 2 + 6 ** 2))Ответ: 36
Квадрат суммы крайних
В каждой строке таблицы 9-1.xlsx, 9-1.txt записаны шесть натуральных чисел. Определи количество строк, в которых квадрат суммы наибольшего и наименьшего чисел больше суммы квадратов четырёх остальных.
Введите число.
Подсказка
Сумму квадратов остальных получи вычитанием из суммы квадратов всей строки.
Решение
Сумма квадратов четырёх остальных — сумма квадратов всей строки без квадратов наименьшего и наибольшего: (m + M)² > Q − m² − M². В таблице =ЕСЛИ((МИН(A1:F1)+МАКС(A1:F1))^2>СУММКВ(A1:F1)-МИН(A1:F1)^2-МАКС(A1:F1)^2;. Подходит 361 строка.
Решение программой
answer = 0with open("9-1.txt") as f: for line in f: a = [int(part) for part in line.split()] m = min(a) big = max(a) squares = sum(x**2 for x in a) if (m + big) ** 2 > squares - m**2 - big**2: answer += 1print(answer)Ответ: 361
Среднее крайних и среднее остальных
Для той же таблицы 9-1.xlsx, 9-1.txt определи количество строк, в которых среднее арифметическое наибольшего и наименьшего чисел больше среднего арифметического четырёх остальных.
Введите число.
Подсказка
Умножь обе части сравнения на 4 — деление не понадобится.
Решение
Сравнение (m + M) / 2 > (S − m − M) / 4 умножаем на 4 и получаем 2(m + M) > S − m − M — без деления. Подходит 480 строк.
Решение программой
answer = 0with open("9-1.txt") as f: for line in f: a = [int(part) for part in line.split()] m = min(a) big = max(a) if 2 * (m + big) > sum(a) - m - big: answer += 1print(answer)Ответ: 480
Наибольшее и среднее остальных
Для той же таблицы 9-1.xlsx, 9-1.txt определи количество строк, в которых наибольшее число больше среднего арифметического пяти остальных более чем в три раза.
Введите число.
Подсказка
Среднее пяти остальных — (S − M) / 5; умножь обе части на 5.
Решение
Остальных чисел пять, их сумма S − M. Условие M > 3 · (S − M) / 5 после умножения на 5 — это 5M > 3(S − M). Подходит 83 строки.
Решение программой
answer = 0with open("9-1.txt") as f: for line in f: a = [int(part) for part in line.split()] if 5 * max(a) > 3 * (sum(a) - max(a)): answer += 1print(answer)Ответ: 83
Целая часть среднего и квадрат
В каждой строке таблицы 9-6.xlsx, 9-6.txt записаны семь натуральных чисел. Определи количество строк, в которых хотя бы одно число равно целой части среднего арифметического всех чисел строки и хотя бы одно число является квадратом натурального числа.
Введите число.
Подсказка
Целая часть среднего — целочисленное деление суммы на количество; квадрат проверяй через isqrt.
Решение
Целая часть среднего натуральных чисел — sum(a) // len(a), её наличие в строке проверяет in. Квадрат натурального числа — isqrt(x) ** 2 == x. В таблице — =СЧЁТЕСЛИ(A1:G1; и столбец квадратов. Обе проверки выполнены в 39 строках.
Решение программой
from math import isqrt answer = 0with open("9-6.txt") as f: for line in f: a = [int(part) for part in line.split()] squares = [x for x in a if isqrt(x) ** 2 == x] if sum(a) // len(a) in a and len(squares) > 0: answer += 1print(answer)Ответ: 39