Задача
Встреча. Из пункта А в пункт В выехал велосипедист со скоростью [latex]v_{0} [/latex] км/час. Одновременно навстречу ему из пункта В двинулся «автостопом» другой путник.[latex]s_{1} [/latex] м он двигался со скоростью [latex]v_{1} [/latex] м/час, [latex]s_{2} [/latex] м — со скоростью [latex]v_{0} [/latex] км/час, [latex]s_{3} [/latex] м — со скоростью [latex]v_{3} [/latex] км/час. Через сколько часов после старта и в какой точке путники встретились?
Тесты
v0, км/час | v1, м/час | v3, км/час | s1, м | s2, м | s3, м | place, км | time, час | Комментарии |
40 | 15000 | 10 | 20000 | 40000 | 40000 | 66.667 | 1.667 | Пройден (встреча на первом промежутке) |
10 | 5000 | 60 | 10000 | 60000 | 30000 | 55.0 | 5.5 | Пройден (встреча на первом промежутке) |
8 | 5000 | 30 | 10000 | 10000 | 80000 | 37.368 | 4.671 | Пройден (встреча на первом промежутке) |
-300 | 30000 | 23333 | 22222 | 5454 | 555.1 | Неправильно введены данные | Не пройден | |
10 | 2222 | 3333 | 0 | -4444 | 11.6 | Неправильно введены данные | Не пройден |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <iostream> #include <math.h> int main() { double v0, v1, v3, place, ss, s1, s2, s3, time, t1, t2, t3 ; //Описание переменных для хранения входных данных.// scanf("%lf%lf%lf%lf%lf%lf", & v0, & v1, & v3, & s1, & s2, & s3) ; //Чтение из стандартного потока ввода.// if ( ( v0 > 0 ) && ( v1 > 0 ) && ( v3 > 0 ) && ( s1 >= 0 ) && ( s2 >= 0 ) && ( s3 >= 0 ) ) //Критерии ввода данных.// { s1 *= 0.001 ; v1 *= 0.001 ; s2 *= 0.001 ; s3 *= 0.001 ; //Перевод единиц в систему СИ. (м --> км, м/час --> км/час) // ss = s1 + s2 + s3 ; //Найдем весь путь// t1 = s1 / v1 ; t2 = s2 / v0 ; t3 = s3 / v3 ; //Найдем время за которое второй путник преодолевает каждую часть пути// if ( ( ss - t1 * v0 - s1 ) <= 0 ) //Условие встречи двух путников на первом промежутке пути// { time = ss / ( v0 + v1 ) ; //Нахождение времени встречи// place = time * v0 ; //Нахождение места встречи// printf("Путники встретились на расстоянии %5.3lf км от пункта В через %5.3lf часов после старта", place, time) ; //Вывод конечного результата.// } else { if ( ( ss - ( t2 + t1 ) * v0 - s1 - s2 ) <=0 ) //Условие встречи двух путников на втором промежутке пути// { time = ( ss - s1 - ( v0 * t1 ) ) / ( v0 + v0 ) ; //Нахождение времени встречи// place = ( t1 + time ) * v0 ; //Нахождение места встречи// printf("Путники встретились на расстоянии %5.3lf км от пункта В через %5.3lf часов после старта", place, time+t1) ; //Вывод конечного результата.// } else { if ( ( ss - ( t2 + t1 + t3 ) * v0 - s1 - s2 - s3 ) <= 0 ) //Условие встречи двух путников на третем промежутке пути// { time = ( ss - s1 - s2 - ( v0 * ( t2 + t1 ) ) ) / ( v0 + v3 ) ; //Нахождение времени встречи// place = ( t1 + t2 + time ) * v0 ; //Нахождение места встречи// printf("Путники встретились на расстоянии %5.3lf км от пункта A через %5.3lf часов после старта", place, time+t1+t2) ; //Вывод конечного результата.// } } } } else { printf("Неправильно введены данные"); //Вывод оповещения о неправильном вводе данных (при несоответствии начальным критериям). } return 0; } |
Можно предположить, что весь путь в задаче представлен суммой [latex]ss=s_{1}+s_{2}+s_{3}[/latex]. Для начала переведем все величины в единицы СИ:
Из метров в километры:
[latex]s_{1}=s_{1}*0.001 \Leftrightarrow s_{1}=\frac{s_{1}}{1000}[/latex], [latex]s_{2}=s_{2}*0.001 \Leftrightarrow s_{2}=\frac{s_{2}}{1000}[/latex], [latex]s_{3}=s_{3}*0.001 \Leftrightarrow s_{3}=\frac{s_{3}}{1000}[/latex].Из метров/час в километры/час: [latex]v_{1}=v_{1}*0.001 \Leftrightarrow v_{1}=\frac{v_{1}}{1000}[/latex]
Найдем место встречи. Тут может быть три случая:
- Встреча двух путников на первом промежутке пути. Тогда время встречи можно вычислить по формуле: [latex]time = \frac{ss}{( v_{0} + v_{1} )}[/latex] , а место встречи — [latex]place = time * v_{0}[/latex]
- Встреча двух путников на втором промежутке пути: Тогда время встречи можно вычислить по формуле: [latex]time =\frac{ss — s_{1} — ( v_{0} * t_{1} ) }{ v_{0} + v_{0} }[/latex] , а место встречи — [latex]place = ( t_{1} + time ) * v_{0}[/latex].
- Встреча двух путников на третьем промежутке пути: Тогда время встречи можно вычислить по формуле: [latex]time = \frac{ ss — s_{1} — s_{2} — ( v_{0} * t_{2} )}{ v_{0}+ v_{3} }[/latex], а место встречи — [latex] place = ( t_{1}+t_{2} + time ) * v_{0}[/latex].
Если путники встречаются на первом промежутке пути, то их скорости суммируются (т.к. тела движутся на встречу друг к другу), при делении всего пути на сумму этих скоростей получим время встречи, расстояние можно найти умножив время встречи на скорость первого путника.
Если путники встречаются на втором промежутке пути, то их скорости аналогично суммируются, но в формуле нахождения времени встречи учитывается путь, пройденный путниками за первый промежуток времени, эту разность делим на сумму скоростей и получаем время встречи. Для того чтобы найти место встречи сложим время путников в пути и время встречи поделим на скорость и найдем место встречи.
Аналогично и на третьем промежутке пути. В формуле нахождения времени встречи учитывается путь, пройденный путниками за первый и за второй промежутки времени, эту разность делим на сумму скоростей и получаем время встречи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import java.util.*; import java.lang.*; import java.io.*; class Meeting { public static void main (String[] args) throws java.lang.Exception { double place, ss, time, t1, t2, t3, tt; //Описание переменных для хранения входных данных.// Scanner in = new Scanner(System.in); //Чтение из стандартного потока ввода.// double v0 = in.nextDouble(); double v1 = in.nextDouble(); double v3 = in.nextDouble(); double s1 = in.nextDouble(); double s2 = in.nextDouble(); double s3 = in.nextDouble(); if ((v0 > 0) && (v1 > 0) && (v3 > 0) && (s1 >= 0) && (s2 >= 0) && (s3 >= 0)) //Критерии ввода данных.// { s1 *= 0.001; v1 *= 0.001; s2 *= 0.001; s3 *= 0.001; //Перевод единиц в систему СИ. (м --> км, м/час --> км/час) // ss = s1 + s2 + s3; //Найдем весь путь// t1 = s1 / v1; t2 = s2 / v0; t3 = s3 / v3; //Найдем время за которое второй путник преодолевает каждую часть пути// if ((ss - t1 * v0 - s1) <= 0) //Условие встречи двух путников на первом промежутке пути// { time = ss / (v0 + v1); //Нахождение времени встречи// place = time * v0; //Нахождение места встречи// System.out.printf("Путники встретились на расстоянии " + place + " км от пункта В через " + time + " часов после старта"); //Вывод конечного результата.// } else { if ((ss - (t2 + t1) * v0 - s1 - s2) <= 0) //Условие встречи двух путников на втором промежутке пути// { time = (ss - s1 - (v0 * t1)) / (v0 + v0); //Нахождение времени встречи// place = (t1 + time) * v0; //Нахождение места встречи// tt = time + t1; System.out.printf("Путники встретились на расстоянии " + place + " км от пункта В через " + tt + " часов после старта") ; //Вывод конечного результата.// } else { if ((ss - (t2 + t1 + t3) * v0 - s1 - s2 - s3) <= 0) //Условие встречи двух путников на третем промежутке пути// { time = (ss - s1 - s2 - (v0 * (t2 + t1))) / (v0 + v3); //Нахождение времени встречи// place = (t1 + t2 + time) * v0; //Нахождение места встречи// tt = time + t1 + t2; System.out.printf("Путники встретились на расстоянии " + place + " км от пункта A через " + tt + " часов после старта"); //Вывод конечного результата.// } } } } else { System.out.printf("Неправильно введены данные"); //Вывод оповещения о неправильном вводе данных (при несоответствии начальным критериям). } } } |
0. Задача сформулирована автором не совсем чётко. Исходя из того, что она относится к разделу алгоритмов с ветвлением (а не линейным, как Вы ошибочно указали), можно предположить, что для второго путника описан весь путь из В в А. Это нужно указать в уточняющем комментарии.
1. Как Вы получили формулу для точки встречи. Приведите вывод. Только сначала всё перепроверьте на бумаге. Вдруг Вы ошиблись?
2. Как Вы строили тесты? Используя своё решение? Лучше это делать при помощи графика движения путников для простых исходных данных.
3. Не очень удачно названа переменная svstr. У программистов считается дурным тоном называть что-либо транслитерацией. Т.е. стараются переводить, а не транслитерировать. Это в коде программы. А в математических формулах допустимо использовать кириллицу в индексах.
Переделал полностью задачу (т.к. условие понял не правильно).
Изменил примеры, добавил формулы и объяснения.
Есть дополнительное предложение.
Можно получить ещё +10 если сделать (закодировать, а не нарисовать в редакторе) рисунок в формате SVG. Как минимум такой
Закодированный рисунок находится тут .
Код рисунка находится тут .
Просто великолепный рисунок вышел! Вы гораздо основательнее разобрались с форматом SVG, чем я мог предположить.
Один минус — анимация не совсем верно отражает происходящее. Второй человек садится в автомобиль и движется навстречу оси времени. Я про такое читал у Стругацких (кажется, «Понедельник начинается в субботу»). Но не вполне уверен, что именно это имел в виду А.Юркин в данной задаче 🙂
Ожидалось, что автомобиль будет перемещаться по прямой идущей вправо вверх.
Я позволил себе пока убрать анимацию, задать размер рисунка и поставить другие цвета, чтобы можно было разглядеть на тёмном фоне.
Если решите доделать, то вставьте Ваш рисунок ниже моего. Если получится хорошо я удалю свой вариант.
Исправил анимацию, возможно так будет нагляднее.
Да, теперь правильно движутся.
Только по Вашей версии, встреча оказалась роковой — никто не добрался до пункта назначения 🙂
Это уже стало делом принципа. Все остались живы. Исправил.