Поймай проблему с самолетом из мирового финала ACM ICPC 2018

Несколько дней я думаю об алгоритме этой проблемы. Я придумал разные решения, но ни одно из них не дало правильного результата. Я думал о направленном ациклическом графе, но кажется, что пассажир может совершить поездку туда и обратно, например, от станции 0 до 3, затем от 3 до 0, а затем от 0 до 1. Я был бы признателен, если кто-то может описать алгоритм (а не код) этой проблемы. Чтобы облегчить поиск, я поставил здесь и проблему.

Ваш самолет до финала ICPC вылетает в скором времени, и единственный способ добраться до аэропорта - на автобусе. К сожалению, некоторые водители автобусов рассматривают возможность забастовки, поэтому вы не знаете, сможете ли вы добраться до аэропорта вовремя. Ваша цель состоит в том, чтобы спланировать свое путешествие таким образом, чтобы максимизировать вероятность попадания в ваш самолет. У вас есть подробная карта города, которая включает в себя все автобусные станции. Вы находитесь на станции 0, а аэропорт - на станции 1. У вас также есть полное расписание, когда каждый автобус покидает свою начальную станцию ​​и прибывает на конечную станцию. Кроме того, для каждого автобуса вы знаете вероятность того, что он действительно будет работать в соответствии с графиком, в отличие от того, что его водитель бастует и выводит автобус из эксплуатации. Предположим, что все эти события являются независимыми. То есть вероятность того, что данный автобус будет работать в соответствии с планом, не изменится, если вы знаете, работает ли какой-либо из других автобусов в соответствии с планом. Если вы прибываете до времени отправления автобуса, вы можете перейти на этот автобус. Но если вы прибудете точно во время отправления, у вас не будет достаточно времени, чтобы сесть на автобус. Вы не можете заранее проверить, будет ли данный автобус работать в соответствии с планом - вы узнаете, только когда попытаетесь сесть в автобус. Таким образом, если два или более автобусов покидают станцию ​​одновременно, вы можете попытаться сесть только на один из них.

вход

количество станций в городе. Следующая строка содержит одно целое число k (1 ≤ k ≤ 10^18), обозначающее время, в которое вы должны прибыть в аэропорт. Каждая из следующих m строк описывает один автобус. Каждая строка содержит целые числа a и b (0 ≤ a, b

Выход

Покажите вероятность того, что вы поймаете свой самолет, предполагая, что вы следуете оптимальному курсу действий. Ваш ответ должен быть правильным с точностью до абсолютной ошибки 10^−6 .

Пример ввода

8 4
1000
0 1 0 900 0.2
0 2 100 500 1.0
2 1 500 700 1.0
2 1 501 701 0.1
0 3 200 400 0.5
3 1 500 800 0.1
3 0 550 650 0.9
0 1 700 900 0.1

Пример вывода

0.3124

Первая строка ввода содержит два целых числа m (1 ≤ m ≤ 10^6) и n (2 ≤ n ≤ 10^6), обозначающих количество шин и

1 ответ

Решение

Рассмотрим событие прибытия, связанное с каждой запланированной поездкой.

Если вы участвуете в прибытии, т. Е. Действительно успешно отправляетесь в запланированное путешествие, то вы попадаете на станцию ​​в момент прибытия и решаете, что делать дальше.

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

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

Процесс заканчивается с наилучшей вероятностью вашего первоначального прибытия на станцию ​​0.

Если вы умны в реализации, все это занимает O(N log N) времени.

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