Матч
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;
}
};