Формальное подтверждение правильности решения Greedy для торговли вином (SPOJ)?

Не поймите меня неправильно, если вы разместите вопрос о проблеме на онлайн-судье. Я просто хочу знать, как доказать правильность решения. Следующая проблема - проблема торговли вином. Там написано, что на расстоянии в единицу стоит ряд домов, и каждый хочет продать или купить вино. Общий спрос = общее предложение. Работа, проделанная в сделке, - это количество вина, умноженное на расстояние. Проблема состоит в том, чтобы удовлетворить потребность всех домов в минимальных работах. Предлагаемое решение состоит в том, что первый продавец (скажем, начиная с правой стороны строки) продает первому покупателю (сумма = мин. (Продавец, покупатель))(это жадный выбор), а затем решает оставшуюся проблему. Как можно формально доказать, что это правильно?

1 ответ

Не уверен, что это так формально, как вы хотите, но вот интуиция доказательства.

Для упрощения отмечу поставщиков как "+", а других как "-".

WLOG, я начну с поставщика на левой стороне. Так что у вас есть выбор покупателя.

+         -    -

Предположим, вы не выбрали первый.

+         -    -
<==============>

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

ОСТАВИЛ

+      +  -    -
<==============>
       <==>

Ну, расстояние точно такое же, как и у жадного решения.

+      +  -    -
<=========>
       <=======>

ПРАВО

+         - +  -
<==============>
          <=>

Ну, жадное решение было бы лучше (так как оно избегает дублирования).

+         - +  -
<=========>
            <==>

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

Другие вопросы по тегам