Задача из журнала «Квант» №4 1970 г.
Крестьянин, подойдя к развилке двух дорог, расходящихся под углом 60°, спросил: «Как пройти в село NN?». Ему ответили: «Иди по левой дороге до деревни N — это в восьми верстах отсюда,— там увидишь, что направо под прямым углом отходит большая ровная дорога,— это как раз дорога в NN. А можешь идти другим путём: сейчас по правой дороге; как выйдешь к железной дороге,— значит, половину пути прошёл; тут поверни налево и иди прямо по шпалам до самого NN». — «Ну, а какой путь короче-то будет?» — «Да всё равно, что так, что этак, никакой разницы.» И пошёл крестьянин по правой дороге. Сколько вёрст ему придётся идти до NN? Больше десяти или меньше? А если идти от развилки до NN напрямик? (Все дороги прямые)
Более лаконичная версия:
Крестьянин стоит на развилке дорог, которые расходятся под углом 60°, и хочет попасть в село NN. Выбрав левую дорогу, он должен будет пройти n вёрст прямо, затем повернуть направо под прямым углом и идти до NN. Выбрав правую, он должен будет преодолеть участок некоторой длины прямо, затем повернуть налево и пройти такой же по длине участок. При этом известно, что длины левой и правой дорог одинаковы. От нас требуется найти длину пути по одной из дорог и длину пути напрямик.
Входные данные:
Длина пути от развилки до N.
Выходные данные:
Длины путей по дороге и напрямик.
Тесты
№ |
Входные данные |
Выходные данные |
|
n |
s1 |
s2 |
1 |
0 |
0 |
0 |
2 |
8 |
11.0416 |
8.55871 |
3 |
0.5 |
0.690101 |
0.534919 |
4 |
21 |
28.9843 |
22.4666 |
5 |
13.45 |
18.5637 |
14.3893 |
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
import java.util.*; import java.lang.*; import java.io.*; import java.util.Scanner; class Ideone { public static void main (String[] args) throws java.lang.Exception { double s1, s2, n, x; Scanner in = new Scanner(System.in); n = Double.parseDouble(in.nextLine()); x = n * (5 - Math.sqrt(3) - Math.sqrt(6 * Math.sqrt(3) - 4))/(8 * (2 - Math.sqrt(3))); s1 = 4 * x; //Длина пути по дороге s2 = Math.sqrt(2 * (n * n - 4 * x * n + 8 * x * x));//Длина пути напрямую System.out.println(s1 + " " + s2); } } |
Код можно увидеть и проверить его правильность тут: ideone
Пояснение
Обозначим развилку как A как, село B, место пересечения правой дороги с рельсами как D, и проведём DH⊥AB и DK⊥BC.
Пусть AD=2x, тогда AH=x; Из треугольника AHD: BK=DH=x⋅√3;
KC=KB−BC=n+x⋅(√3−4).
Из треугольника
CKD по теореме Пифагора:
KC2+KD2=CD2. Подставив значения, раскрыв скобки и проведя математические преобразования, получим квадратное уравнение
x2⋅(−4√3+8)−x⋅n⋅(√3−5)+n2=0.
Найдём дискриминант
D=n2⋅(6√3−4).
KD=n−x и
KD>0, значит,
n−x>0 и
x<n. Для первого из корней полученного квадратного уравнения это условие не выполняется, соответственно, мы имеем лишь один корень. Найдя его, мы найдём половину длины
AD. Выведем формулу для его расчёта:
x=n⋅(5−√3−√6⋅√3−4)8⋅(2−√3)
Тогда длина пути по дороге будет равна
4⋅x, а длину пути напрямик мы найдём из треугольника
ABC по теореме Пифагора:
s2=√2⋅(n2−4x⋅n+8n2).