модульная арифметическая головоломка codeforces - PullRequest
0 голосов
/ 24 апреля 2019

Автомобиль движется из точки А в точку Б со скоростью v метров в секунду. Действие происходит на оси X. На расстоянии d метров от A находятся светофоры. Начиная с момента 0, в течение первых g секунд горит зеленый свет, затем в течение следующих r секунд горит красный свет, затем снова горит зеленый свет в течение g секунд и т. Д.

Автомобиль может быть мгновенно ускорен с 0 до v, и наоборот, может мгновенно замедляться с v до 0. Предположим, что он мгновенно пропускает светофор на зеленый свет. Если автомобиль приближается к светофору в тот момент, когда только что включился красный свет, он не успевает проехать. Но если он приближается к светофору в тот момент, когда только что загорелся зеленый свет, он может двигаться. Машина покидает точку А в момент времени 0.

Какое минимальное время для проезда автомобиля из пункта А в пункт Б без нарушения правил дорожного движения?

Input целые числа l, d, v, g, r (1 ≤ l, d, v, g, r ≤ 1000, d

решение

if(g*v>d)
 ans = l/v   // i got it
else
 ceil(d/v/g+r)*(g+r)+(l-d)/v  // i am not getting Please help

Пример-> предположим, что l = 5, d = 4, v = 1, g = 2, r = 1

При t = 0 автомобиль начинается с $ A $

При t = 2 свет становится красным, но автомобиль находится далеко от света, поэтому без проблем продолжайте движение

При t = 3 свет снова становится зеленым на $ 2 $ sec (до $ t = 5 $)

При t = 4 свет еще зеленый и мы достигаем света

Примечание-> мы пересекаем светофор, не волнуйтесь

При t = 5 мы достигаем в точке B

Но верный ответ = 7, который не является минимальным, где я делаю неправильно?

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

Помогите, пожалуйста, мне грустно. Я пытаюсь найти правильную логику за 3 дня.

Вот вы, люди, моя последняя надежда.

ссылка о проблеме проблема b

Принятая ссылка решения красного кодера

Примечание-> вышеупомянутое принятое решение, дающее 7 в качестве вывода. Но я думаю, что это должно быть 5. Так что это не может быть неправильно, так как codeforces принял это.

1 Ответ

0 голосов
/ 24 апреля 2019

Да, вы правы, ответ должен быть 5.

Условие g * v > d не имеет никакого смысла.Он просто проверяет, можете ли вы проехать светофор во время первой зеленой фазы.На самом деле это должно быть ((d + v - 1) / v) % (g + r) < g.Сначала мы вычисляем, в какую секунду мы пропускаем светофор с (d + v - 1) / v (целочисленное деление), которое совпадает с ceil(d / v), если мы используем числа с плавающей запятой.Затем по модулю мы вычисляем, где в зеленом красном цикле мы проезжаем на светофоре.Если результат равен < g, мы пропустили его, когда он был зеленым, а решение было (double)l / v.

. Вы можете использовать ту же технику с модулем, что и выше, чтобы получить количество секунд, на которое мы должны остановитьсясветофор, а затем добавить время от начала до светофора (целых секунд) и время от светофора до пункта назначения.Или мы можем рассчитать количество секунд, которое нам нужно до конца зеленого красного цикла при прохождении светофора.Это то, что вы сделали, но вам не хватает скобок, поэтому для чисел с плавающей запятой мы могли бы использовать вашу формулу с дополнительными скобками:
ceil(d / v / (g + r)) * (g + r) + (l - d) / v.

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