Блог пользователя Igel_SK

Автор Igel_SK, 14 лет назад, По-русски
Подскажите, пожалуйста, задачу на каком-нибудь из online judges, которая решается с помощью симплекс-метода. Недавно проходили его в университете и хочется проверить, правильно ли я пишу этот алгоритм.
  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

14 лет назад, # |
Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится
Вроде бы вот.
Но там надо чуть соптимизировать. Подробности есть в обсуждении задачи.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    На самом деле не надо там ничего оптимизировать. С теми ограничениями абсолютно любая вменаемая реализация проходит на ура. В разные времена "Триатлон" служит тестовой площадкой для разных по степени криворукости моих реализаций симплекс-метода :) И они все проходили за 0.016, если мне не изменяет память.

    Что касается получаемых командами ТЛ-ей - на тестах этой задачки случается достаточно редкое явление - зацикливание СМ. В этом и есть причина. Один из способов борьбы - "Правило Бленда" (вроде так), описано в Кормене или гугл. Состоит в дописании примерно одной строчки к коду СМ...

14 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

http://www.codechef.com/problems/OVENTIME

Для тестирования, думаю, любая задача на поток подойдет.

  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Очень многие классические задачи на графах можно сформулировать в терминах ЛП. В принципе, подойдут даже задачки на "Дейкстру" и т.д. :) Преимущество потоков состоит в том, что метод Форда-Фалкерсона является чем-то вроде прообраза симплекс-метода, сформулированного на графах. Есть подозрения, что реальное время работы будет достаточно близко. Если кто-то сравнивал поток через ФФ и СМ на одних тестах - интересно было бы послушать...
14 лет назад, # |
Rev. 3   Проголосовать: нравится +4 Проголосовать: не нравится

Вроде как в чистом виде на Тимусе

  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Ну эта скорее в чистом виде на метод Гаусса :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      На самом деле если посмотреть на матрицу в этой задаче можно предложить итеративное решение. Без Гаусса.

      А вот вроде в этой этой задаче как раз надо решить СЛУ.

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        В ней можно и не решать СЛУ. Есть же стандартные методы для вычисления коэффициентов многочленов за O(N2).
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Поделитесь способом, если не сложно.
          • 14 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

            Первый способ.

            Второй способ не такой универсальный, как первый, но в принципе очень удобный.

            Как раз при нахождении формулы для какой-то последовательности, которая задаётся каким-то многочленом.

            Пусть у нас есть значения многочлена в точках {0, 1, 2, ..., k}  — P(0), P(1), ..., P(k).

            Тогда обозначим a[0][0] = P(0), a[0][1] = P(1), ..., a[0][k] = P(k).

            После этого вычислим a[1][0] = a[0][1] - a[0][0], a[1][1] = a[0][2] - a[0][1], ..., a[1][k - 1] = a[0][k] - a[0][k - 1].

            Затем по такому же принципу a[i][j] = a[i - 1][j + 1] - a[i - 1][j] для 1 ≤ i ≤ k, 0 ≤ j ≤ k - i. То есть получаем треугольник из попарных разностей значений предыдущей строчки.

            Далее возьмём первый столбец (c0 = a[0][0], c1 = a[1][0], ..., ck = a[k][0]).

            Искомый многочлен имеет вид


14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Вот эта прекрасная задача на Тимусе с чемпионата Урала:


Об нее убились почти все команды, потому что пытались решить потоком.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Спасибо всем.