К содержанию

Подтема 2 из 7

Соседние пары и тройки

Как перебрать все пары и тройки идущих подряд чисел и собрать ответ: сколько групп подходит и какая у них наибольшая сумма.

Соседние пары

Как перебрать все пары соседних чисел?

Пара с началом i — это a[i] и a[i + 1], а i пробегает все начала по очереди. У восьми чисел темы пары такие: (125, 1300), (1300, −1250), …, (2025, 3000). Пары пересекаются: 1300 — второе число первой пары и первое число второй. Так и должно быть — брать пары через одну нельзя.

Каждая скобка — соседняя пара. Последняя начинается с индекса 6: её второй элемент — последний элемент списка a[7].

Где остановить i? Второй элемент пары — a[i + 1], а последний индекс списка n − 1. Значит, i + 1 ≤ n − 1, то есть i ≤ n − 2. Такие начала 0, 1, …, n − 2 даёт range(n - 1): правая граница в range не входит.

a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]for i in range(len(a) - 1):    print(i, a[i], a[i + 1])
0 125 1300 1 1300 -1250 2 -1250 -2100 3 -2100 7 4 7 -325 5 -325 2025 6 2025 3000

Соседние тройки

А как перебрать тройки?

Тройка с началом i — a[i], a[i + 1], a[i + 2]. Последний индекс i + 2 ≤ n − 1, поэтому начала перебирает range(n - 2).

Шесть соседних троек восьми чисел: каждая следующая сдвинута на одно число. Последняя начинается с индекса n − 3 = 5.
iТройкаСумма
0125, 1300, −1250175
11300, −1250, −2100−2050
2−1250, −2100, 7−3343
3−2100, 7, −325−2418
47, −325, 20251707
5−325, 2025, 30004700

Для групп из k соседних чисел правило то же: range(n - k + 1). Например, четвёрки перебирают range(n - 3).

Количество и наибольшая сумма

Как получить ответ — количество подходящих троек и наибольшую сумму?

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

a = [125, 1300, -1250, -2100, 7, -325, 2025, 3000]sums = []for i in range(len(a) - 2):    s = a[i] + a[i + 1] + a[i + 2]    if s <= 2025:        sums.append(s)print(len(sums), max(sums))
5 1707

sums.append(s) стоит внутри if: сумма попадает в список, только если тройка подошла. Каждая подходящая тройка добавляет ровно одну сумму, поэтому len(sums) — их количество. Если у двух троек одинаковые суммы, это всё равно две тройки: повторы из списка не удаляют.

Тонкости:если подходящих троек нет

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

Итого

  • Параa[i], a[i + 1] при i in range(n - 1)
  • Тройкаa[i], a[i + 1], a[i + 2] при i in range(n - 2)
  • k соседнихrange(n - k + 1)
  • Пересечениесоседние группы делят элементы — так и надо
  • Ответsums.append(s) внутри if, затем len(sums) и max(sums)

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

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

Вопрос 1
Сколько соседних пар и сколько соседних троек в последовательности из 10 000 чисел?
ОтветСкрыть ответ
Ответ
Пар 9999, троек 9998: n − 1 и n − 2.
Вопрос 2
Выпиши все соседние тройки последовательности 4, 7, 10, 3.
ОтветСкрыть ответ
Ответ
(4, 7, 10) и (7, 10, 3) — у четырёх чисел две тройки.
Вопрос 3
Почему тройки перебирают range(len(a) - 2), а не range(len(a))?
ОтветСкрыть ответ
Ответ
При i = n - 2 индекс i + 2 равен n, а такого элемента нет: программа остановится с ошибкой.
Вопрос 4
Что выведет программа из раздела «Количество и наибольшая сумма», если порог 2025 заменить на 0?
ОтветСкрыть ответ
Ответ
3 -2050: подходят суммы −2050, −3343 и −2418, наибольшая из них −2050.
Вопрос 5
В той же программе строку sums.append(s) сдвинули влево, на уровень if. Что она выведет?
ОтветСкрыть ответ
Ответ
6 4700: сумма каждой тройки попадёт в список без проверки.

Практика

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

Сколько соседних групп

Сколько соседних пар, троек и четвёрок в последовательности из 2000 чисел?

Введите через пробел количество пар, троек и четвёрок.

Четвёрки с суммой, кратной 7

Последовательность 1, 2, 3, 4, 5, 6. Найди количество соседних четвёрок, сумма которых кратна 7, и максимальную такую сумму.

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

Тройки с суммой, кратной 10

В файле 17-1.txt содержится последовательность целых чисел от −10 000 до 10 000. Определите количество троек элементов последовательности, сумма которых кратна 10, затем максимальную из сумм элементов таких троек. Под тройкой подразумевается три идущих подряд элемента последовательности.

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

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

Оба отрицательные, сумма кратна 5

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

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

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