Язык
Ввод и вывод, условия, циклы, списки и функции. Для начала достаточно одного знакомого языка.
ПЕРВЫЕ АЛГОРИТМЫ · 10–15 МИНУТ
Одна задача — два решения. Разберём полный перебор, найдём способ быстрее и проверим, что алгоритм не пропускает ответы.
Автор: Никита Саралашвили · 12 октября 2026
Ввод и вывод, условия, циклы, списки и функции. Для начала достаточно одного знакомого языка.
Маленький пример руками, затем код. Обязательно проверьте повторы, пустой ответ и граничные значения.
Оцените число действий при большом входе. Работающий на пяти числах перебор может оказаться слишком медленным на ста тысячах.
АВТОРСКАЯ УЧЕБНАЯ ЗАДАЧА
Даны n целых чисел и число S. Найдите количество пар различных позиций i < j, для которых a[i] + a[j] = S. Одинаковые значения на разных позициях считаются отдельно.
Первая строка содержит n и S, вторая — n чисел. Например:
5 6
1 5 3 3 5Ответ: 3. Единица образует пару с каждой из двух пятёрок. Ещё одна пара — две тройки.
n, s = map(int, input().split())
a = list(map(int, input().split()))
answer = 0
for i in range(n):
for j in range(i + 1, n):
if a[i] + a[j] == s:
answer += 1
print(answer)Второй индекс начинается с i + 1: число не складывается само с собой, а каждая пара рассматривается один раз. Проверок n(n − 1) / 2 — это O(n²). При n = 100 000 получится 4 999 950 000 проверок.
Для текущего x нужен партнёр S − x. В словаре храним, сколько раз каждое число встречалось до текущей позиции.
n, s = map(int, input().split())
a = list(map(int, input().split()))
seen = {}
answer = 0
for x in a:
answer += seen.get(s - x, 0)
seen[x] = seen.get(x, 0) + 1
print(answer)Сначала считаем пары, потом добавляем x. Если поменять строки местами, при S = 6 число 3 ошибочно образует пару само с собой.
На каждой позиции учитываются ровно те подходящие партнёры, которые стоят раньше. Поэтому каждая пара будет посчитана один раз. В среднем решение выполняется за O(n) времени и использует O(n) дополнительной памяти; это оценка при обычной работе хеш-таблицы Python.
| Числа | S | Ответ | Что проверяем |
|---|---|---|---|
| 3 | 6 | 0 | Нельзя брать одну позицию дважды |
| 3, 3, 3, 3 | 6 | 6 | Все пары повторяющихся чисел |
| −2, 4, 0, 2 | 2 | 2 | Отрицательные числа и ноль |
| 1, 2, 3 | 20 | 0 | Подходящих пар нет |
Для уверенности можно сравнивать быстрый алгоритм с перебором на коротких случайных списках. Перебор становится удобным эталоном для проверки.
Найдите количество пар с суммой 8 в списке 2, 6, 4, 4, 6, 2. Сначала ответьте без запуска, затем проверьте код.
5 пар. Две двойки и две шестёрки дают 2 × 2 = 4 пары. Две четвёрки дают ещё одну.
Для конкретной олимпиады проверьте её правила: допустимые языки, ограничения времени и формат ввода. Эта задача учебная и не является официальным вариантом олимпиады.
Никита Саралашвили — репетитор по информатике и программированию, автор Академии С. Обсудим ваш уровень и подберём следующие темы.