Жадный алгоритм – это метод конструирования решения, при котором на каждом шаге выбирается локально наилучший вариант из допустимых с точки зрения некоторого критерия. Дальнейшее решение строится на основе уже принятого выбора без возврата и пересмотра. Такая стратегия эффективна тогда, когда выполняются строго формализуемые свойства задачи (жадное свойство выбора и оптимальная подструктура). В подготовке к ЕГЭ по информатике это направление важно по трём причинам:
многие экзаменационные задачи естественно редуцируются к жадным схемам (интервальное планирование, покрытие, «размен» и т. п.);
жадные алгоритмы тренируют доказательные техники (инварианты, аргумент обмена, свойства «сечения» и «цикла»);
жадные решения часто дают линейные или квазилинейные оценки сложности и позволяют уверенно оценивать порядок роста.
Модель задачи

Условия корректности
Для корректности жадной стратегии обычно достаточно (и в ряде классов задач – необходимо) двух свойств:
Оптимальная подструктура: оптимальное решение задачи содержит оптимальные решения её подзадач (после фиксирования части выбора).
Жадное свойство выбора: существует оптимальное решение, начинающееся с локально лучшего выбора по фиксированному критерию.
Доказательства строятся через:
Аргумент обмена (exchange argument): любой оптимум можно постепенно «переисправить», меняя элементы на жадно выбранные, не ухудшая целевую функцию.
Свойства сечения/цикла (для графов): безопасный выбор ребра, который гарантированно содержится в некотором минимальном остовном дереве и т. п.
Матроидная теория (достаточное и необходимое условие): на матроидах жадный алгоритм всегда оптимален при любой аддитивной целевой функции.
Инварианты жадного шага
При каждом выборе поддерживается инвариант: «построенная часть решения может быть продолжена до некоторого оптимума». Если после жадного шага инвариант нарушается, критерий выбора некорректен.
Интервальное планирование (максимум несовмещающихся отрезков)
Задача: из множества интервалов [si,fi) выбрать максимальное по мощности подмножество, в котором никакие два не пересекаются.
Жадный критерий: сортировать по возрастанию fi (времени окончания) и последовательно брать первый совместимый с уже выбранными интервал.
Доказательство: аргумент обмена – любой оптимум можно «сместить» к более раннему окончанию без уменьшения мощности.
Размен монет (системы с «хорошей» структурой)

Дробный рюкзак (реальная доля предмета разрешена)
Задача: максимизировать суммарную ценность при ограничении по весу W, разрешая дробить предметы.
Жадный критерий: сортировать по удельной ценности vi/wi и «заливать» рюкзак сверху вниз.
Оптимальность: следует из линейности (выпуклости) – это задача линейного программирования с базисным решением жадного вида.
Минимальное остовное дерево (МОД): Краскал/Прим
Краскал: сортировка рёбер по весу и добавление «лёгких» рёбер, не образующих цикла (проверка объединением множеств).
Прим: наращивание дерева из стартовой вершины, каждый раз добавляя минимальное ребро, пересекающее текущий «фронт».
Доказательство: свойство сечения – минимальное по весу ребро, пересекающее любое сечение, безопасно (содержится в некотором МОД).
Кратчайшие пути без отрицательных рёбер: Дейкстра
Критерий: на каждом шаге «фиксировать» вершину с минимальной текущей оценкой расстояния; обновлять её соседей.
Условие: все веса рёбер неотрицательны; иначе жадная фиксация неверна.
Оптимальные префиксные коды: Хаффман
Критерий: многократно сливать две наименее вероятные «листья» с минимальными весами.
Доказательство: аргумент обмена + «свойство ближайших соседей»: в некотором оптимальном дереве два минимальных веса – соседи.
Выразите цель как аддитивную функцию (сумма выигрышей/стоимостей). Если цель неаддитивна или содержит сильные глобальные зависимости, жадность подозрительна.
Сформулируйте жадный критерий естественного смысла (минимум окончания, максимум удельной ценности, минимум веса на сечении).
Докажите жадное свойство выбора: через обмен/сечение. Без доказательства – это эвристика, не алгоритм.
Проверьте оптимальную подструктуру: после локального выбора задача сужается того же типа.
Подберите структуру данных: сортировка (O(n log n)), очередь с приоритетами (O((n+m) log n)), система непересекающихся множеств (DSU/Union-Find) – для Краскала.
Оцените границы применимости: зафиксируйте условия (неотрицательные веса для Дейкстры, каноничность монет, ацикличность для топологического порядка и т. п.).

Шаг сортировки часто доминирует: O(n log n).
Жадный выбор через структуру приоритетов: O(log n) на извлечение/вставку.
DSU с ранком и сжатием путей: амортизированно O(α(n)) на операцию (почти константа).
Память обычно O(n) или O(n+m) для графов.
Инварианты реализуются через метки «зафиксирован/не зафиксирован», «выбран/не выбран», поддерживаемые структуры (очередь, куча).
Подмена доказательства интуицией («кажется разумным»).
Игнорирование краевых условий (нулевые веса, равные окончания интервалов, отрицательные рёбра).
Неверный критерий сортировки (активности по началу вместо окончания).
Смешивание 0/1-рюкзака (недробимого) с дробным (жадность ломается).
Путаница минимизации/максимизации: выбор «максимального» вместо «минимального» безопасного элемента.
Нарушение допустимости при добавлении элемента (пересечение интервалов, образование цикла и т. п.).
В КИМ ЕГЭ регулярно встречаются задачи, решаемые жадно:
Интервальные задачи (выбор непересекающихся мероприятий, минимальное число аудиторий, покрытие точек отрезками).
Табличные и файловые задачи (выбор записей по критерию, сортировка, подсчёты при упорядочивании).
Кодирование/сжатие (понимание Хаффмана и средней длины кода).
Маршруты без отрицательных весов (идея Дейкстры на уровне рассуждений).
Практический «чек-лист ЕГЭ»:
Могу ли я упорядочить объекты по одному числу/отношению?
Сохранится ли тип подзадачи после выбора первых объектов?
Могу ли я защитить выбор аргументом обмена/сечения?
Есть ли контрпример против жадности (быстрый тест корректности)?
Упражнение 1. Интервальное планирование и критерий окончания
Дано nnn интервалов [si,fi).
a) Предложите жадный алгоритм выбора максимального числа непересекающихся интервалов, чётко сформулировав критерий и порядок сортировки.
b) Докажите корректность через аргумент обмена: покажите, как любое оптимальное решение можно преобразовать в решение жадного алгоритма без ухудшения.
c) Оцените временную сложность и укажите структуру данных, необходимую для реализации.
Упражнение 2. Размен монет: каноничность и контрпример
Рассмотрим номиналы {1, 3, 4}.
a) Примените жадный размен для суммы S=6 и покажите получившееся решение.
b) Найдите оптимальное решение и сравните с жадным (количество монет).
c) Сформулируйте общее условие, при котором система номиналов является «канонической» для жадного размена (не требуется строгое доказательство, дайте корректную формулировку и примеры).
Упражнение 3. Дробный рюкзак и удельная ценность
Есть предметы (wi,vi) и вместимость W.
a) Опишите жадный алгоритм с сортировкой по vi/wiv_i/w_ivi/wi и аккуратно запишите инвариант.
b) Докажите оптимальность через рассуждение о линейной структуре задачи (или через контрпозицию к 0/1-рюкзаку).
c) Оцените сложность и укажите, как изменится реализация при замене сортировки на «онлайновое» поддержание кучи.
Упражнение 4. МОД: Краскал, Прим и свойства сечения/цикла
Дан связный взвешенный неориентированный граф G=(V, E).
a) Сформулируйте свойство сечения и докажите, что минимальное ребро, пересекающее любое фиксированное сечение, безопасно для МОДа.
b) Запишите псевдокод алгоритма Краскала, указав использование DSU (Union–Find) и оценив сложность.
c) Сравните Краскала и Прима по применимости (плотные/разреженные графы, выбор структур данных).
Упражнение 5. Дейкстра и ограничение на веса
Рассмотрим ориентированный граф с неотрицательными весами.
a) Обоснуйте жадную фиксацию ближайшей непосещённой вершины через инвариант расстояний.
b) Приведите небольшой пример, где единственное отрицательное ребро разрушает корректность Дейкстры (укажите порядок шагов и неверную фиксацию).
c) Сравните с алгоритмом Беллмана–Форда: когда следует выбирать его вместо жадного подхода?
Жадные алгоритмы – это не «угадывание», а строго доказуемая стратегия, работающая при наличии жадного свойства выбора и оптимальной подструктуры. Они предоставляют мощные решения с простыми реализациями и хорошими асимптотиками: от интервалов и размена до остовных деревьев, кратчайших путей (без отрицательных весов) и оптимальных префиксных кодов. Освоение шаблонов, инвариантов и аргумента обмена превращает многие задачи ЕГЭ в последовательность формальных шагов: выбрать критерий → доказать безопасность шага → реализовать и оценить сложность. Это обеспечивает точность, скорость и стабильный высокий результат на экзамене.