ПЕРВЫЕ АЛГОРИТМЫ · 10–15 МИНУТ

Олимпиадное программирование: с чего начать

Одна задача — два решения. Разберём полный перебор, найдём способ быстрее и проверим, что алгоритм не пропускает ответы.

Автор: Никита Саралашвили · 12 октября 2026

Какие основы пригодятся

1

Язык

Ввод и вывод, условия, циклы, списки и функции. Для начала достаточно одного знакомого языка.

2

Проверка идеи

Маленький пример руками, затем код. Обязательно проверьте повторы, пустой ответ и граничные значения.

3

Сложность

Оцените число действий при большом входе. Работающий на пяти числах перебор может оказаться слишком медленным на ста тысячах.

АВТОРСКАЯ УЧЕБНАЯ ЗАДАЧА

Пары с заданной суммой

Даны n целых чисел и число S. Найдите количество пар различных позиций i < j, для которых a[i] + a[j] = S. Одинаковые значения на разных позициях считаются отдельно.

Первая строка содержит n и S, вторая — n чисел. Например:

5 6
1 5 3 3 5

Ответ: 3. Единица образует пару с каждой из двух пятёрок. Ещё одна пара — две тройки.

1. Начнём с полного перебора

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 проверок.

2. Вспомним числа, которые уже встречались

Для текущего x нужен партнёр S − x. В словаре храним, сколько раз каждое число встречалось до текущей позиции.

Текущее xИщем S − xДобавляем 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.

3. Проверим крайние случаи

ЧислаSОтветЧто проверяем
360Нельзя брать одну позицию дважды
3, 3, 3, 366Все пары повторяющихся чисел
−2, 4, 0, 222Отрицательные числа и ноль
1, 2, 3200Подходящих пар нет

Для уверенности можно сравнивать быстрый алгоритм с перебором на коротких случайных списках. Перебор становится удобным эталоном для проверки.

Теперь самостоятельно

Найдите количество пар с суммой 8 в списке 2, 6, 4, 4, 6, 2. Сначала ответьте без запуска, затем проверьте код.

Проверить ответ и объяснение

5 пар. Две двойки и две шестёрки дают 2 × 2 = 4 пары. Две четвёрки дают ещё одну.

Проверить программу в Python →

Что изучать дальше

  1. Сортировка и частоты: как упорядочить данные и посчитать повторы.
  2. Префиксные суммы: как быстро находить сумму на отрезке.
  3. Два указателя и двоичный поиск: когда можно сократить перебор.
  4. Графы и динамическое программирование: после уверенного освоения предыдущих приёмов.

Для конкретной олимпиады проверьте её правила: допустимые языки, ограничения времени и формат ввода. Эта задача учебная и не является официальным вариантом олимпиады.

Нужен понятный старт?

Никита Саралашвили — репетитор по информатике и программированию, автор Академии С. Обсудим ваш уровень и подберём следующие темы.