Матч 413, Метро 2 (Subway2)

Дивизион 2, Уровень 1

 

Расстояние между остановками в метро равно length. Согласно безопасности движения скорость метрополитена не должна превышать maxVelocity, а ускорение maxAcceleration. Поезд начинает движение со станции со скоростью 0, а приехав на следующую станцию, должен остановиться. Вычислить наименьшее время, за которое поезд может пройти расстояние между двумя соседними станциями.

 

Класс: Subway2

Метод: double minTime(int length, int maxAcceleration,

                      int maxVelocity)

Ограничения: 1 £ length, maxAcceleration, maxVelocity  £ 1000.

 

Вход. Целые значения length, maxAcceleration, maxVelocity.

 

Выход. Наименьшее время, за которое поезд может пройти расстояние между двумя соседними станциями.

 

Пример входа

length

maxAcceleration

maxVelocity

1

2

10

1

1

1

778

887

384

 

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

1.4142135623730951

2.0

2.458961621570838

 

 

РЕШЕНИЕ

математика

 

Из школьной физики известны формулы, связывающие путь s, скорость v и ускорение a:

v = at, s = at2 / 2

Время разгона trazg, за которое метро достигнет скорости maxVelocity, равно

trazg = maxVelocity / maxAcceleration

За время trazg метро проедет расстояние

srazg = maxAcceleration * trazg * trazg / 2

Это расстояние между остановками метро должно проехать дважды, так как оно сначала должно разогнаться, а в конце маршрута тормозить. Если удвоенный путь разгона больше length, то метро не сможет набрать максимальную скорость: оно сначала будет разгоняться до некоторой скорости v < maxVelocity, после чего сразу начнет тормозить. В этом случае время разгона и торможения одинаковы и равны .

Если метро сможет набрать скорость maxVelocity за время trazg, то расстояние length – 2*srazg оно проедет со скоростью maxVelocity. В этом случае на весь путь между остановками будет потрачено время, равное

2*trazg + (length – 2*srazg) / maxVelocity

 

ПРОГРАММА

 

#include <stdio.h>

#include <math.h>

 

class Subway2

{

public:

  double minTime(int length, int maxAcceleration, int maxVelocity)

  {

    double trazg = 1.0*maxVelocity / maxAcceleration;

    double srazg = maxAcceleration * trazg * trazg / 2,res=0;

    if (2*srazg > length)

      res = 2*sqrt(1.0*length/maxAcceleration);

    else

      res = 2*trazg + (length - 2*srazg)/maxVelocity;

    return res;

  }

};