5D - Follow Traffic Rules - CodeForces Solution


implementation math *2100

Please click on ads to support us..

Python Code:

import math

a, v = list(map(int, input().split()))
l, d, w = list(map(int, input().split()))

time_to_reach_max = v / a
length_to_reach_max = (v * v) / (2 * a)
velocity_at_sign = math.sqrt(2 * d * a)

if length_to_reach_max <= d:
  if v <= w:
        print("%.5f" % (time_to_reach_max + ((l - length_to_reach_max) / v)))
  else:
    TIME_BEFORE_SIGN = 0
    velocity_diff = v - w
    time_to_reach_diff = velocity_diff / a
    length_to_peak_velocity_from_sign = ((velocity_diff * velocity_diff) / (2 * a)) + (w * time_to_reach_diff)
    peak_2_from_berland = d - length_to_peak_velocity_from_sign
    if peak_2_from_berland >= length_to_reach_max:
      TIME_BEFORE_SIGN = time_to_reach_diff + time_to_reach_max + ((peak_2_from_berland - length_to_reach_max) / v)
    else:
            time_to_reach_w = w / a
      length_to_reach_w = (w * w) / (2 * a)
      distance_left = d - length_to_reach_w
      time_to_sign = (((-1) * w) + math.sqrt((w ** 2) + (a * distance_left))) / a
      TIME_BEFORE_SIGN = time_to_reach_w + (2 * time_to_sign)
    
    TIME_AFTER_SIGN = 0
    time_to_max = (v - w) / a
    length_to_max = (((v - w) * (v - w)) / (2 * a)) + (w * time_to_max)
    length_rest = l - d
    if length_to_max >= length_rest:
            TIME_AFTER_SIGN = (((-1) * w) + math.sqrt((w ** 2) + (2 * a * length_rest))) / a
    else:
      TIME_AFTER_SIGN = time_to_max + ((length_rest - length_to_max) / v)
    print("%.5f" % (TIME_BEFORE_SIGN + TIME_AFTER_SIGN))
else:
  if velocity_at_sign <= w:
    if length_to_reach_max <= l:
      print("%.5f" % (time_to_reach_max + ((l - length_to_reach_max) / v)))
    else:
      print("%.5f" % (math.sqrt((2 * l) / a)))
  else:
    time_to_reach_w = w / a
    length_to_reach_w = (w * w) / (2 * a)
    distance_left = d - length_to_reach_w
    time_to_sign = (((-1) * w) + math.sqrt((w ** 2) + (a * distance_left))) / a
    TIME_BEFORE_SIGN = time_to_reach_w + (2 * time_to_sign)

    TIME_AFTER_SIGN = 0
    time_to_max = (v - w) / a
    length_to_max = (((v - w) * (v - w)) / (2 * a)) + (w * time_to_max)
    length_rest = l - d
    if length_to_max >= length_rest:
            TIME_AFTER_SIGN = (((-1) * w) + math.sqrt((w ** 2) + (2 * a * length_rest))) / a
    else:
      TIME_AFTER_SIGN = time_to_max + ((length_rest - length_to_max) / v)
    print("%.5f" % (TIME_BEFORE_SIGN + TIME_AFTER_SIGN))


Comments

Submit
0 Comments
More Questions

1671D - Insert a Progression
1671A - String Building
1671B - Consecutive Points Segment
1671C - Dolce Vita
1669G - Fall Down
4D - Mysterious Present
1316B - String Modification
1204A - BowWow and the Timetable
508B - Anton and currency you all know
1672A - Log Chopping
300A - Array
48D - Permutations
677C - Vanya and Label
1583B - Omkar and Heavenly Tree
1703C - Cypher
1511C - Yet Another Card Deck
1698A - XOR Mixup
1702E - Split Into Two Sets
1703B - ICPC Balloons
1702F - Equate Multisets
1700A - Optimal Path
665C - Simple Strings
1708A - Difference Operations
1703E - Mirror Grid
1042A - Benches
1676B - Equal Candies
1705B - Mark the Dust Sweeper
1711A - Perfect Permutation
1701B - Permutation
1692A - Marathon