К содержанию

Подтема 5 из 7

Порог по всей последовательности

Почему порог из условия находят до перебора троек — и задача темы целиком: ответ 8358 99821.

Сначала порог

Порог задачи темы — максимальный элемент, оканчивающийся на 25. Можно ли проверять тройки сразу, пока читаем числа по порядку?

Нет: число в конце файла может оказаться больше всех прежних и поднять порог — даже для самых первых троек. Поэтому сначала проходят весь список и находят порог, а потом перебирают тройки. Посмотри, как меняется наибольший элемент на 25, пока читаем восемь чисел темы:

До седьмого числа порог — 125, и только 2025 поднимает его до окончательного. Под числами — суммы троек против окончательного порога: не проходит лишь последняя, 4700.

Первая тройка 125, 1300, −1250 с суммой 175 подходит под порог 2025. Если сравнить её с порогом на момент чтения — 125, — она не пройдёт, и ответ на восьми числах получится 3 вместо 4.

Поэтому решение проходит по списку дважды: первый проход находит порог, второй перебирает тройки. Два прохода по 10 000 чисел программа делает мгновенно.

Отбор и характеристика

Как найти максимальный элемент, оканчивающийся на 25?

Сначала нужные числа отбирают в отдельный список, потом применяют к нему .

a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]ends = [x for x in a if abs(x) % 100 == 25]print(ends, max(ends))
[125, -325, 2025] 2025

Это с условием: перебрать x из a и взять x, если он оканчивается на 25. В список кладут исходные числа: x, а не abs(x). Модуль нужен только для проверки окончания — иначе вместо −325 в списке окажется 325, а это другое число.

Из отобранного списка получают любую характеристику, которую спрашивает условие:

максимальный такой элемент
max(ends)
минимальный такой элемент
min(ends)
количество таких элементов
len(ends)так считают порог «количество чисел, кратных 2042»
сумма таких элементов
sum(ends)

У пустого списка нет ни максимума, ни минимума: max([]) — ошибка. В файлах задания нужные числа есть, а иногда условие прямо это гарантирует.

Задача темы целиком

Теперь все части задачи на месте — как их собрать?

Порог находят до цикла, тройки проверяют в цикле, ответ выводят после цикла. Сначала — вручную на восьми числах темы, с порогом 2025:

ТройкаЧетырёхзначныхСуммаПодходит?
125, 1300, −12502175да
1300, −1250, −21003−2050нет: три четырёхзначных
−1250, −2100, 72−3343да
−2100, 7, −3251−2418да
7, −325, 202511707да
−325, 2025, 300024700нет: сумма больше 2025

На восьми числах ответ 4 1707. Программа для файла задачи темы:

def four(x):    return 1000 <= abs(x) <= 9999  with open("17.txt") as f:    a = [int(x) for x in f]limit = max([x for x in a if abs(x) % 100 == 25])sums = []for i in range(len(a) - 2):    x, y, z = a[i], a[i + 1], a[i + 2]    k = int(four(x)) + int(four(y)) + int(four(z))    if k <= 2 and x + y + z <= limit:        sums.append(x + y + z)print(len(sums), max(sums))
8358 99821

Ответ задачи темы: 8358 99821. Порог по файлу — 99825. Чтобы проверить программу, замени чтение файла строкой a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]: должно получиться 4 1707.

Среднее арифметическое

Порог бывает и средним — например, «меньше среднего арифметического всех чётных элементов последовательности». Как его считать?

Среднее считают по той группе, что названа в условии: сумма её чисел, делённая на их количество. Сравнивают без деления: вместо x < s / k пишут x * k < s. В последовательности 2, 9, 4, 7, 12 чётные числа 2, 4, 12, их сумма 18, количество 3, среднее 6:

a = [2, 9, 4, 7, 12]even = [x for x in a if x % 2 == 0]s = sum(even)k = len(even)print(s / k, 4 * k < s, 7 * k < s)
6.0 True False

4 меньше среднего, 7 — нет. Делить сумму чётных на длину всего списка нельзя: в знаменателе количество той же группы. Умножать обе части на k можно, потому что k положительно, а сравнение без деления точное — в нём нет дробей.

Исходный список не трогаем

Можно ли упростить перебор — отсортировать числа или выбросить неподходящие?

Нет: соседи есть только в исходном порядке. Сортировка и удаление чисел создают пары, которых в файле не было.

Слева пары исходной последовательности, справа — после сортировки и после отбора чётных. Пар (10, 20) и (2, 4) в исходной последовательности не было.

Отобрать отдельный список для порога можно — как ends выше. Но тройки перебирают в исходном списке a. И порог считают один раз, до цикла: если написать max(...) внутри цикла, программа будет заново проходить весь список на каждой тройке — 10 000 раз по 10 000 чисел.

Итого

  • Порогпо всему списку, до перебора троек
  • Отбор[x for x in a if abs(x) % 100 == 25]
  • Исходные числав список — x, а не abs(x)
  • Характеристикаmax, min, len, sum отобранного списка
  • Среднееx * k < s вместо x < s / k
  • Задача темы8358 99821; на восьми числах — 4 1707

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Числа последовательности, оканчивающиеся на 5: −35, 15, −5, 25. Какой у них минимальный и какой максимальный элемент? Почему максимальный — не 35?
ОтветСкрыть ответ
Ответ
Наименьшее −35, наибольшее 25. Числа 35 в последовательности нет: это модуль −35, а сравнивают исходные числа.
Вопрос 2
На восьми числах темы покажи тройку, которая пройдёт проверку с окончательным порогом, но не пройдёт с порогом на момент чтения.
ОтветСкрыть ответ
Ответ
125, 1300, −1250: сумма 175 не больше 2025, но больше 125 — порога после первых трёх чисел.
Вопрос 3
Последовательность 3, 8, 6, 5, 4. Какие числа меньше среднего арифметического чётных? Запиши проверку без деления.
ОтветСкрыть ответ
Ответ
Чётные 8, 6, 4: сумма 18, количество 3, среднее 6. Меньше — 3, 5 и 4. Проверка x * 3 < 18.
Вопрос 4
Что выведет print(len([x for x in [10, -25, 125, 7] if abs(x) % 100 == 25]))?
ОтветСкрыть ответ
Ответ
2: на 25 оканчиваются −25 и 125.
Вопрос 5
Почему перед перебором троек нельзя отсортировать список или выбросить из него числа, которые не оканчиваются на 25?
ОтветСкрыть ответ
Ответ
Тройки — это соседи в исходном порядке. После сортировки или удаления рядом окажутся числа, которые в файле соседями не были.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Порог — наибольший на 17

Последовательность 12, 117, 40, 217, 5. Найди наибольший элемент, оканчивающийся на 17, затем количество соседних пар с суммой больше него и максимальную такую сумму.

Введите через пробел порог, количество пар и максимальную сумму.

Порог — количество кратных 25

Для файла 17-1.txt определите количество пар, в которых хотя бы одно число отрицательное, а сумма пары меньше количества чисел файла, кратных 25. В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар. Под парой подразумевается два идущих подряд элемента.

17-1.txtПоследовательность целых чисел от −10 000 до 10 000Текстовый файл · 4,3 КБ

Введите через пробел количество пар, затем максимальную сумму.

В файле 17.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от −100 000 до 100 000 включительно. Определите количество троек элементов последовательности, в которых не более двух из трёх элементов являются четырёхзначными числами, а сумма элементов тройки не больше максимального элемента последовательности, оканчивающегося на 25. В ответе запишите количество найденных троек чисел, затем максимальную из сумм элементов таких троек. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.

17.txtПоследовательность целых чисел от −100 000 до 100 000Текстовый файл · 62,2 КБ

Введите через пробел количество троек, затем максимальную сумму.

Тройки и максимум на 21

В файле 17-2.txt содержится последовательность натуральных чисел, не превышающих 100 000. Определите количество троек, в которых ровно два числа четырёхзначные, хотя бы одно число делится на 7, а сумма элементов тройки больше максимального элемента последовательности, запись которого оканчивается на 21. В ответе запишите количество найденных троек, затем максимальную из сумм элементов таких троек. Под тройкой подразумевается три идущих подряд элемента.

17-2.txtПоследовательность натуральных чисел, не превышающих 100 000Текстовый файл · 4,2 КБ

Введите через пробел количество троек, затем максимальную сумму.

Меньше среднего чётных

Последовательность 6, 9, 2, 15, 4. Найди количество соседних пар, в которых одно число кратно трём, а другое меньше среднего арифметического всех чётных элементов, и максимальную сумму таких пар.

Введите через пробел количество пар, затем максимальную сумму.

Среднее нечётных без деления

Для файла 17-2.txt определите количество пар, в которых одно число делится на 9, а другое меньше среднего арифметического всех нечётных элементов последовательности. В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар. Под парой подразумевается два идущих подряд элемента.

17-2.txtПоследовательность натуральных чисел, не превышающих 100 000Текстовый файл · 4,2 КБ

Введите через пробел количество пар, затем максимальную сумму.