-
Notifications
You must be signed in to change notification settings - Fork 0
/
1h-stadium-run.js
99 lines (73 loc) · 5.99 KB
/
1h-stadium-run.js
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
H. Забег по стадиону
Ограничение времени 1 секунда (фактическое использование на тестах – до 82ms)
Ограничение памяти 256Mb (фактическое использование на тестах – до 5.52Mb)
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Стадион представляет собой окружность длиной L метров, на которой отмечена точка старта. По стадиону бегают Кирилл и Антон. У каждого мальчика есть своя точка старта (она представляет собой расстояние в метрах от старта, отсчитанное по часовой стрелке) и своя скорость в метрах в секунду (положительная скорость означает, что мальчик бежит по часовой стрелке, отрицательная — что бежит против часовой, а нулевая — что он стоит на месте).
Вам нужно сказать, через какое минимальное время мальчики окажутся на одинаковом расстоянии от точки старта. Обратите внимание, что в этот момент они могли находиться в разных точках. Расстоянием от точки A до точки B называется минимальное из расстояний, которое нужно пробежать из точки A по или против часовой стрелки, чтобы оказаться в B.
Формат ввода
В единственной строке вводится 5 целых чисел L, x1, v1, x2, v2 (1 ≤ L ≤ 10^9, 0 ≤ x1, x2 < L, |v1|, |v2| ≤ 10^9) — длины стадиона в метрах, начальная точка Кирилла, скорость Кирилла, начальная точка Антона, скорость Антона.
Формат вывода
В первой строке выведите слово «YES», если случится момент, когда мальчики будут на одинаковом расстоянии от старта, или «NO», если такого момента не произойдёт.
Если ответ «YES», то во второй строке выведите одно вещественное число — через какое минимальное количество времени мальчики окажутся на одинаковом расстоянии от старта.
Вы можете выводить каждую букву в любом регистре (строчную или заглавную). Например, строки «yEs», «yes», «Yes» и «YES» будут приняты как положительный ответ.
Ваш ответ будет считаться правильным, если его абсолютная или относительная ошибка не превосходит 10^−9.
Формально, пусть ваш ответ равен a, а ответ жюри равен b. Ваш ответ будет зачтен, если и только если (|a−b| / max(1,|b|)) ≤ 10^−9.
Пример 1
Ввод
6 3 1 1 1
Вывод
YES
1.0000000000
Пример 2
Ввод
12 8 10 5 20
Вывод
YES
0.3000000000
Пример 3
Ввод
5 0 0 1 2
Вывод
YES
2.0000000000
Пример 4
Ввод
10 7 -3 1 4
Вывод
YES
0.8571428571
Примечания
В первом тесте Кирилл изначально находится в точке 3 и бежит по часовой стрелке со скоростью 1. Антон находится в точке 1 и также бежит по часовой стрелке со скоростью 1. Через 1 секунду мальчики окажутся в точках 4 и 2 соответственно. Обе эти точки расположены на расстоянии 2 метра от старта (точки 0, совпадающей с точкой 6). Можно показать, что до этого они всегда находились на разном расстоянии от старта. Значит, ответ — 1.
Во втором тесте оба мальчика окажутся в точке 11 через 0.3 секунды.
В третьем Антон прибежит к Кириллу в точку 0 за 2 секунды.
*/
const fs = require('fs');
const input = fs.readFileSync('input.txt', 'utf8').toString().trim();
const [stadiumLength, firstRunnerPos, firstRunnerSpeed, secondRunnerPos, secondRunnerSpeed] = input.split(' ').map((value) => parseInt(value));
const formulasResults = [
(firstRunnerPos - secondRunnerPos) / (secondRunnerSpeed - firstRunnerSpeed),
(firstRunnerPos + secondRunnerPos - stadiumLength) / (- firstRunnerSpeed - secondRunnerSpeed),
(firstRunnerPos + secondRunnerPos) / (- secondRunnerSpeed - firstRunnerSpeed),
((stadiumLength - firstRunnerPos) + (stadiumLength - secondRunnerPos)) / (secondRunnerSpeed + firstRunnerSpeed),
(secondRunnerPos - firstRunnerPos - stadiumLength) / (firstRunnerSpeed - secondRunnerSpeed),
(firstRunnerPos - secondRunnerPos - stadiumLength) / (secondRunnerSpeed - firstRunnerSpeed),
];
const filteredResults = formulasResults.map((result) => {
if (Number.isNaN(result)) {
return 0;
} else if (result < 0) {
return Infinity;
}
return result;
});
let hasResult = '';
let result = Math.min(...filteredResults);
if (Math.abs(result) !== Infinity) {
hasResult = 'YES';
} else {
hasResult = 'NO';
result = 0;
}
fs.writeFileSync('output.txt', `${hasResult}\n${hasResult === 'YES' ? result.toFixed(10) : ''}`);