Авторський розв'язок задачі Railroad

Умова


Задача Railroad. Новий потяг «Інтерсіті» проходить заключний етап випробувань. Одно з завдань цього етапу – проїхати від станції А до станції В, відстань між якими рівне L у наступному режимі: розігнатися з прискоренням a1 до швидкості, не більшої за V, проїхати з цією швидкістю час, не менший за t, зупинитися на станції В, гальмуючи з прискоренням по модулю а2. Розрахуйте мінімальний час руху потягу.

Технічні умови. Програма Railroad читає з пристрою стандартного введення числа L, a1, a2, v, t. через пропуск. Величини L, a1, a2, v — додатні, дійсні; t — невід’ємне, дійсне, ціла частина всіх величин не більша 103 . Програма виводить на пристрій стандартного введення єдине число - час знаходження потяга в дорозі з точністю 10-4

Приклади

ВведенняВиведення
40.5 0.5 0.6 3 7.5 19.00000000
20.5 0.5 0.6 3 7.5 14.37300711

Розв'язування

Математична модель

Дана задача для любителів фізики. І насправді як виявилось, точність 10-4 дозволяє звести цю задачу до двох розгалужень або до двох життєвих випадків. Максимальну швидкість, яку розвине наш потяг ми можемо змінювати за умовою задачі від 0 до v, а час на ділянкі рівномірного руху, ми можемо змінювати в межах від t до безкінечності. В даній задачі в нас три випадки, але в третьому випадку похибка наскільки низька, що третім випадком можна знехтувати. Хоча під час розв'язування цієї задачі я цей випадок розглядав. Спочатку виведемо формулу загальної відстані, яку має пройти потяг, долаючи всі відрізки шляху.

Перша ділянка. На першій ділянці в нас рух рівноприскорений. Згідно з законами рівноприскореного руху шлях на цій ділянці буде рівний:

Оскільки, швидкість, з якою починає свій рух потях рівна 0, то v0=0. Тому формула прийме вигляд:

Час на цій ділянці буде рівний:

Друга ділянка. Друга ділянка руху рівномірна прямолінійна, з тією швидкістю, до якої потяг розігнався на першій ділянці руху. Тому тут шлях буде рівний:

l2=v*t

Час на цій ділянці буде рівний часу t2=t - тобто часові руху на рівномірній ділянці шляху

Третя ділянка.На третій ділянці в нас рух також рівноприскорений. Але потяг гальмує і вже з іншим прискоренням a2. Згідно з законами рівноприскореного руху шлях на цій ділянці буде рівний:

Оскільки, швидкість, з якою починає гальмувати потях рівна v, то v0=v, на платформі він зупиниться, тому v=0. Тому формула прийме вигляд:

Знак мінус перед вираз вказує на те, що прискорення було направлене протилежно до початкової швидкості тіла, але нас цікавить тільки шлях, який пройде тіло під час гальмування, тому мінус опускаємо. Тому загальна формула шляху l прийме вигляд:

Час на цій ділянці буде дорівнювати:

Загальний час руху буде обраховуватися за такою формулою тоді:

Перший випадок. Уявимо, що ми підставили дану максимальну швидкість і час рівномірного руху із вхідних даних, і виявили, що шлях l1, менший чим шлях l між пунктами А та B із умови задачі. Тобто, ми розігнали потяг до максимально можливої швидкості, він прорухався рівномірно час t, загальмував і недоїхав. В даному випадку, нам необхідно збільшити час руху на рівномірній ділянці шляху, оскільки максимальну швидкість ми збільшувати вже не можемо. Виведемо формулу часу руху на рівномірній ділянці руху, і підставимо її в загальний час руху. І тоді виведемо загальний час руху на екран. Для цього в формулу загального шляху замість l1 підставимо шлях l із вхідних даних. Виведення:

Таким чином ми взнаємо, скільки часу мав би рухатися потяг на рівномірній ділянці шляху, щоб проїхати весь шлях l. Підставивши цей чав в tz ми знайдемо загальний час.

Другий випадок.Уявимо, що ми підставили дану максимальну швидкість і час рівномірного руху із вхідних даних, і виявили, що шлях l1, більший чим шлях l між пунктами А та B із умови задачі. Тобто, ми розігнали потяг до максимально можливої швидкості, він прорухався рівномірно час t, загальмував і переїхав більшу відстань. В даному випадку, нам необхідно зменшити максимальну швидкість, а час руху на рівномірній ділянці шляху, залишити таким ж. Виведемо формулу для визначення максимальної швидкості в даному випадку, і підставимо її в формулу загального час руху. І тоді виведемо загальний час руху на екран. Для цього в формулу загального шляху замість l1 підставимо шлях l із вхідних даних. Виведення:

Залишиться цю швидкість підставити в загальний час руху tz і вивести на екран.

Третій випадок.Уявимо, що ми підставили дану максимальну швидкість і час рівномірного руху із вхідних даних, і виявили, що шлях l1, рівний шляху l між пунктами А та B із умови задачі. Тобто, ми розігнали потяг до максимально можливої швидкості, він прорухався рівномірно час t, загальмував і проїхав точно таку відстань. В даному випадку, нам необхідно просто підставити максимальну швидкість і час руху на рівномірній ділянці в формулу tz. Але оскільки, порівняння дійсних чисел на рівність в комп'ютері не можливе, якщо вирази обраховуються за різними формулами, то розробити такий випадок можна тільки з певною точністю, а оскільки формули що першого випадку, що другого випадку підходять для обрахунку цього випадку з допустимою точністю умови задачі для типу double, то третій випадок є як частковий випадок обох цих подій, тому його можна навіть не розглядати.

Реалізація

#include<strio.h>//бібліотека введення і виведення з функціями printf і scanf
#include<cmath> //бібліотека з коренем квадратним
using namespace std;
int main(void){
double l,a1,a2,v,t,l1;//Створюємо змінні, необхідні для розв'язування задачі типу double з подвійною точністю плаваючих чисел
scanf("%lf %lf %lf %lf %lf",&l,&a1,&a2,&v,&t);//Вводимо вхідні дані функцією scanf
l1=(v*v/(2*a1))+v*t+(v*v/(2*a2)); //Обраховуємо l1
if(l1-l<=0)//Перевіряємо умову першого випадку
{
t=(l-(v*v/(2*a1))-(v*v/(2*a2)))/v;//Обраховуємо час рівномірного руху за розробленою математичною моделлю вище
printf("%.8lf", t+v/a1+v/a2);//Обраховуємо загальний час і відразу виводимо функцією scanf з вісьма знаками після коми
}else//Якщо умова першого випадку не виконається, то ми попадемо в другий випадок
{
v=(-t+sqrt(t*t+((2*l*(a2+a1))/(a1*a2))))/((a1+a2)/(a1*a2));//Обраховуємо максимальну швидкість за розробленою математичною моделлю вище
printf("%.8lf", t+v/a1+v/a2);//Обраховуємо загальний час і відразу виводимо функцією scanf з вісьма знаками після коми
}
return 0;
}

Немає коментарів:

Дописати коментар

Авторські розв'язки олімпіади NetOi2020(I етап)

NetOi2020(Iетап) Задача Mult2020 Задача Railroad Задача Detour