RACETIME Editorial

PROBLEM LINK:

Practice
Contest

Author: Baban Gain
Tester: Baban Gain
Editorialist: Baban Gain

DIFFICULTY:

EASY

PREREQUISITES:

Basic Maths, High school Physics

PROBLEM:

Given the ground friction G and length of a racing track L (in meters) and points (1 for braking point, 2 for Acceleration point, 3 for steady point) of a track and Acceleration A and braking B of a car, find the time required to finish one lap.

EXPLANATION:

Two forumulas should come handy to solve the problem,
v^2 - u^2 = 2as
t = (v-u) /a

Consider You are starting from point X and the next point is at Y after s meters.

Let the acceleration/declaration from X and Y is a
Then a = A (for acceleration point),
a = -B (for braking point),
a = -G (for steady point)

Then, the final velocity when reaching Y is, v = sqrt(u*u+2*a*s)
Where u=initial velocity. While starting the race, the initial velocity is 0. After reaching every point, the final velocity becomes the next segment’s initial velocity.

Now, we have u,v, and acceleration a of a segment i, we need to find the time taken.
t_i = (v_i-u_i)/a_i. Then time taken for all segments are added and printed.

total = \sum_{i=i}^{segments} t_i

However, what if the car stop while braking or when in steady before reaching the next acceleration point? It means It will never be able to finish the race. Therefore if in any segment
u*u+2*a*s is less than 0, then -1 should be printed.

SOLUTIONS:

Setter's Solution
import math
from math import sqrt



def get_v(u, a, s):
    v_sq = (2 * a * s) + (u ** 2)
    if v_sq < 0:
        return -1
    return math.sqrt(v_sq)


T = int(input())
for z in range(T):
    tym = 0
    last_vel = 0
    acc, breaking, ground = map(float, input().split())
    length, no_of_points = map(int, input().split())
    points = []
    # Add accelearation from starting point
    points.append((2, 0))
    for i in range(no_of_points):
        typ, dist = map(int, input().split())
        points.append((typ, dist))
    # Add end point to calculate time
    points.append((1, length))
    unable_to_finish = False
    for i in range(1, len(points)):
        typ = points[i - 1][0]
        dist = points[i][1] - points[i - 1][1]
        # print(typ, dist)
        a = 0
        if typ == 1:
            a = -breaking
        elif typ == 2:
            a = acc
        else:
            a = -ground

        v = get_v(last_vel, a, dist)
        if v<0:
            unable_to_finish = True
            break
        x = (v - last_vel) / a
        tym += x
        last_vel = v
    if unable_to_finish:
        print(-1)
    else:
        print(tym)

Link to Solution

2 Likes