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

Автор NALP, 14 лет назад, По-русски

Разбор задачи "C. Тир"


Во-первых, нужно сказать, что в данной задаче элементы теории вероятностей не играют существенной роли. То есть можно считать, что у i-ой мишени всего лишь есть некоторый "вес", который равен как раз вероятности попадания в нее, а именно pi. Достаточно просто понять, почему это так:

Математическое ожидание количества попадания в i-ую мишень равно Mi = 0 * (1 - pi) + 1 * pi = pi, а математическое ожидание попадания в несколько мишеней по очереди равно сумме математических ожиданий, а значит, по уже сказанному, равно сумме вероятностей попадания в эти мишени.

Поэтому нами (авторами этой задачи) предлагается решение динамическим программированием, а именно:

Di равно максимальному математическому ожиданию попаданий, если у нас на данный момент прицел направлен в мишень номер i, причем, текущее время (которое, однако, не является параметром и явно нигде не учитывается) меньше или равно ti.

Тогда Di = pi + max(Dj), где j-ая мишень обозначает следующую мишешь, куда мы переместим прицел. Соответственно, для нее должно выполняться условие: ti + dist(i, j) ≤ tj, для того, чтобы такой переход имел место быть. Очевидно, что граф переходов ацикличен, а это значит, что такое решение верно.

Ответом является максимальное Di по всем 1 ≤ i ≤ n. Асимптотика данного решение O(n2).
  • Проголосовать: нравится
  • +17
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
странно что  фраза что все пары (x,y) разные есть (хотя на решение это не влияет) а вот то что все t различные нет (необходимое условие для динамики)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Различность всех ti - не есть обязательное условие для динамики. Это так, потому что расстояние между любыми двумя мишенями - положительное число, а значит, чтобы перейти от мишени i к мишени j должно выполняться: ti < tj. именно СТРОГОЕ отношение.

    Значит, динамика ациклична.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Сорри. не прав.
14 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится
Стоит отметить, что большинство ошибок и челленджей по этой задаче была вызвана переполнением при возведении в квадрат времён (что делали многие, чтобы избежать работы с дробными числами).
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

А почему в динамике приплюсовывается единица? Где учитываются вероятности?

  • 14 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится
    Да, там где фраза "Тогда Di = 1 + max(Dj) ...", наверное должно быть "Тогда Di = pi + max(Dj) ...".
    • 14 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      прошу прощения...
      конечно, формула выглядит именно так.

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

Может кому-то подойдет альтернативное решение: создаем класс мишень, со всеми полями, считываем, сортируем по времени. Заполняем матрицу смежности по условию достижимости следующей мишени значениями вероятности попадания в следующую мишень. Применяем модификацию флойда: i до k, j от k+1. Находим максимум среди сумм вероятности i той мишени и получивщихся для нее значений в матрице длин путей.

Возможные баги: будте осторожны с инициализацией матрицы смежности. Присваивайте не достижимым значениям отрицательное значение по меньше, что бы в процессе суммирование оно не вышло за ноль. При подсчете максимума из сумм прибавляете длину пути только если она >=0 или ноль если она <0.

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Я использовал слегка другой подход — создал ориентированный граф, где вершинами являются мишени, а ребро между двумя вершинами существует тогда, когда можно успеть перевести прицел от одной мишени к другой. Каждой вершине присваивается вес (вероятность попадания). Тогда задача сводится к тому, чтобы найти наибольший суммарный вес среди всех путей. Чтобы это сделать, рассматриваем каждую вершину по очереди как начало пути и выполняем из неё обход. Чтобы ускорить программу, я использовал динамику — сохранял наибольший суммарный вес S для вершины, если из неё можно пройти путь веса S.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    а разве это не тоже самое?

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

    =)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Ну да, поэтому и есть "слегка". Это даже ещё меньше, чем слегка, но реализации всё равно не одинаковые. ок nvrmnd