Подтема 2 из 7
Соседние пары и тройки
Как перебрать все пары и тройки идущих подряд чисел и собрать ответ: сколько групп подходит и какая у них наибольшая сумма.
Соседние пары
Как перебрать все пары соседних чисел?
Пара с началом i — это a[i] и a[i + 1], а i пробегает все начала по очереди. У восьми чисел темы пары такие: (125, 1300), (1300, −1250), …, (2025, 3000). Пары пересекаются: 1300 — второе число первой пары и первое число второй. Так и должно быть — брать пары через одну нельзя.
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])Соседние тройки
А как перебрать тройки?
Тройка с началом i — a[i], a[i + 1], a[i + 2]. Последний индекс i + 2 ≤ n − 1, поэтому начала перебирает range(n - 2).
| i | Тройка | Сумма |
|---|---|---|
| 0 | 125, 1300, −1250 | 175 |
| 1 | 1300, −1250, −2100 | −2050 |
| 2 | −1250, −2100, 7 | −3343 |
| 3 | −2100, 7, −325 | −2418 |
| 4 | 7, −325, 2025 | 1707 |
| 5 | −325, 2025, 3000 | 4700 |
Для групп из 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))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)
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
range(len(a) - 2), а не range(len(a))?ОтветСкрыть ответ
i = n - 2 индекс i + 2 равен n, а такого элемента нет: программа остановится с ошибкой.ОтветСкрыть ответ
3 -2050: подходят суммы −2050, −3343 и −2418, наибольшая из них −2050.sums.append(s) сдвинули влево, на уровень if. Что она выведет?ОтветСкрыть ответ
6 4700: сумма каждой тройки попадёт в список без проверки.Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Сколько соседних групп
Сколько соседних пар, троек и четвёрок в последовательности из 2000 чисел?
Введите через пробел количество пар, троек и четвёрок.
Подсказка
Группа из k соседних чисел начинается на индексах от 0 до n − k: всего n − k + 1 начал.
Решение
Пар n − 1 = 1999, троек n − 2 = 1998, четвёрок n − 3 = 1997.
n = 2000print(n - 1, n - 2, n - 3)Ответ: 1999 1998 1997
Четвёрки с суммой, кратной 7
Последовательность 1, 2, 3, 4, 5, 6. Найди количество соседних четвёрок, сумма которых кратна 7, и максимальную такую сумму.
Введите через пробел количество четвёрок, затем максимальную сумму.
Подсказка
Последний индекс четвёрки — i + 3, поэтому начала перебирает range(len(a) - 3).
Решение
Суммы четвёрок 10, 14, 18 — кратна 7 только 14.
a = [1, 2, 3, 4, 5, 6]sums = []for i in range(len(a) - 3): s = a[i] + a[i + 1] + a[i + 2] + a[i + 3] if s % 7 == 0: sums.append(s)print(len(sums), max(sums))Ответ: 1 14
Тройки с суммой, кратной 10
В файле 17-1.txt содержится последовательность целых чисел от −10 000 до 10 000. Определите количество троек элементов последовательности, сумма которых кратна 10, затем максимальную из сумм элементов таких троек. Под тройкой подразумевается три идущих подряд элемента последовательности.
Введите через пробел количество троек, затем максимальную сумму.
Подсказка
Складывай в список суммы подходящих троек: его длина — количество, max — ответ.
Решение
Тройки перебирает range(len(a) - 2), сумма подходящей тройки попадает в список внутри if.
with open("17-1.txt") as f: a = [int(x) for x in f]sums = []for i in range(len(a) - 2): s = a[i] + a[i + 1] + a[i + 2] if s % 10 == 0: sums.append(s)print(len(sums), max(sums))Ответ: 87 17460
Оба отрицательные, сумма кратна 5
В файле 17-1.txt содержится последовательность целых чисел от −10 000 до 10 000. Определите количество пар, в которых оба числа отрицательные, а сумма кратна 5, затем максимальную из сумм элементов таких пар. Под парой подразумевается два идущих подряд элемента последовательности.
Введите через пробел количество пар, затем максимальную сумму.
Подсказка
Обе проверки знака соедини с проверкой суммы через and. Подходящие суммы отрицательные — это нормально.
Решение
Все подходящие суммы отрицательные, поэтому и максимальная из них отрицательная.
with open("17-1.txt") as f: a = [int(x) for x in f]sums = []for i in range(len(a) - 1): x, y = a[i], a[i + 1] if x < 0 and y < 0 and (x + y) % 5 == 0: sums.append(x + y)print(len(sums), max(sums))Ответ: 60 -30