Рассмотрим следующую задачу : Нам дано целое число и k интервалов [ l i , r i ] с 1 ≤ l i ≤ r i ≤ 2 n . Нам также даны 2 n целых чисел d 1 , … , d 2 n ≥ 0 . Задача состоит в том, чтобы выбрать минимальное количество интервалов [ l i , r i ]так что для каждого выбираются как минимум d i интервалы, содержащие целое число i .
Нетрудно понять, что можно решить за полиномиальное время (см. Ниже).
Теперь рассмотрим следующую слегка модифицированную задачу : ввод задачи такой же, как и раньше. Однако теперь задача состоит в том, чтобы выбрать минимальное количество интервалов, чтобы для каждого не менее d 2 i - 1 интервалов, содержащих целое число 2 i - 1, или как минимум d 2 i интервалов, содержащих целое число 2 Я выбран («или» мы имеем в виду обычное логическое или).
Мой вопрос: можно ли решить за полиномиальное время?
Вот два способа эффективного решения :
Простой жадный алгоритм: пролистайте интервалы слева направо и выберите только те интервалы, которые необходимы для «удовлетворения» чисел . Всякий раз, когда есть выбор между различными интервалами, выбирайте один или несколько интервалов с максимальной правой конечной точкой.
Целочисленная программа: для каждого интервала ввести переменную решения x i ∈ { 0 , 1 } с x i = 1, если интервал выбран. Цель состоит в том, чтобы минимизировать x 1 + … + x k с учетом ограничений ∑ j : i ∈ [ l j , r j ] x j ≥ d i, Матрица ограничений этой целочисленной программы обладает свойством последовательных единиц, и, следовательно, линейная программная релаксация этой программы имеет целочисленное оптимальное решение.
Спасибо за любые подсказки, а также за ссылки!
источник