Задача
Автостоп-2. Из пункта А в пункт В, между которыми [latex]s[/latex] км, выехал велосипедист с постоянной скоростью [latex]v_{0}[/latex] км/ч. Навстречу ему — из пункта В — другой путешественник решил добраться «автостопом» — на разных видах попутного транспорта. Перед каждым участком он [latex]\tau _{i}[/latex] минут «голосует», ожидая попутного транспорта, затем движется [latex]t _{i}[/latex] часов со скоростью [latex]v _{i}[/latex] км/час ( величины [latex]\tau _{i}, t _{i}, v _{i}, i=1,2,\ldots,n[/latex] заданы в соответствующих массивах). Через какое время после старта и на каком расстоянии от пункта А путники встретятся?
Тесты
s | [latex]v_{0}[/latex] | n | [latex]\tau _{i}[/latex] | [latex]t _{i}[/latex] | [latex]v _{i}[/latex] | place, км | time, ч | Комментарий |
100.0 | 30.0 | 1 | 60.0 | 1.0 | 40.0 | 60.0 | 2.0 | Пройден |
100.0 | 10.0 | 1 | 0.0 | 1.0 | 40.0 | Путники не доехали до места встречи | Не пройден | |
130.0 | 15.0 | 2 | 0.0 3.0 | 1.0 2.6 | 40.0 33.3 | 2.587267 | 38.809006 | Пройден |
Код программы
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 |
#include <iostream> using namespace std; int main() { int n; cin >> n; double place, time, wait [n], mov [n], speed [n], s, v0, timee = 0.0, delta, ss = 0.0, dist = 0.0; cin >> s; cin >> v0; for (int i = 0 ; i < n; i++) { cin >> wait[i]; wait[i] /= 60; } for (int i = 0 ; i < n; i++) { cin >> mov[i]; } for (int i = 0 ; i < n; i++) { cin >> speed[i]; } for (int i = 0 ; i < n; i++) { delta = v0 * wait[i] ; timee += wait[i] ; if ( s <= delta ) { time = s / v0; place = s; printf("Путники встретятся через %lf часов на расстоянии в %lf км от точки А", time, place); break; } ss += v0 * mov[i] + v0 * wait[i] + mov[i] * speed[i]; if (ss >= s ) { time = ( s - dist - delta ) / ( v0 + speed[i]) + timee ; place = time * v0 ; printf("Путники встретятся через %lf часов на расстоянии в %lf км от точки А", time, place); break; } else { dist = ss; } timee += mov[i]; } if ( ss < s ) printf("Путники не доехали до места встречи"); return 0; } |
- Пока второй ждал — первый уже проехал весь путь.
- Если после i-ого этапа (т.е. после ожидания транспортного средства, поездки на нем) сумма пройденного пути второго и первого путника больше, чем весь путь.
Далее высчитываем само место и время встречи.
В конце программы, за циклом, проверяем каков общий пройденный путь двух путников и если он меньше всего пути, то выводим сообщение, что они так и не встретились.
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 |
import java.util.*; import java.lang.*; import java.io.*; class Hitchhiking { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); int n = in.nextInt(); double place, time, delta, timee = 0.0, ss = 0.0, dist = 0.0; double[] wait = new double[n], mov = new double[n], speed = new double[n]; double s = in.nextDouble(); double v0 = in.nextDouble(); for (int i = 0; i < n; i++) wait[i] = in.nextDouble() / 60; for (int i = 0; i < n; i++) mov[i] = in.nextDouble(); for (int i = 0; i < n; i++) speed[i] = in.nextDouble(); for (int i = 0; i < n; i++) { delta = v0 * wait[i] ; timee += wait[i] ; if (s <= delta) { time = s / v0; place = s; System.out.printf("Путники встретятся через " + time + " часов на расстоянии в " + place + " км от точки А"); break; } ss += v0 * mov[i] + v0 * wait[i] + mov[i] * speed[i]; if (ss >= s) { time = (s - dist - delta) / (v0 + speed[i]) + timee; place = time * v0 ; System.out.printf("Путники встретятся через " + time + " часов на расстоянии в " + place + " км от точки А"); break; } else { dist = ss; } timee += mov[i]; } if (ss < s) System.out.printf("Путники не доехали до места встречи"); } } |
Для отправки комментария необходимо войти на сайт.