КМ17. Крестьянин на развилке

Задача из журнала «Квант» №4 1970г.

Крестьянин, подойдя к развилке двух дорог, расходящихся под углом 60°, спросил: <Как пройти в село [latex]NN?[/latex]> Ему ответили: <Иди по левой дороге до деревни [latex]N[/latex] — это в восьми верстах отсюда,— там увидишь, что направо под прямым углом отходит большая ровная дорога,— это как раз дорога в [latex]NN[/latex]. А можешь идти другим путём: сейчас по правой дороге; как выйдешь к железной дороге,— значит, половину пути прошёл; тут поверни налево и иди прямо по шпалам до самого NN>. — <Ну, а какой путь короче-то будет?> — <Да всё равно, что так, что этак, никакой разницы.> И пошёл крестьянин по правой дороге. Сколько вёрст ему придётся идти до NN? Больше десяти или меньше? А если идти от развилки до [latex]NN[/latex] напрямик? (Все дороги прямые.)

Более лаконичная версия:
Крестьянин стоит на развилке дорог, которые расходятся под углом 60°, и хочет попасть в село [latex]NN[/latex]. Выбрав левую дорогу, он должен будет пройти [latex]n[/latex] вёрст прямо, затем повернуть направо под прямым углом и идти до [latex]NN[/latex]. Выбрав правую, он должен будет преодолеть участок некоторой длины прямо, затем повернуть налево и пройти такой же по длине участок. При этом известно, что длины левой и правой дорог одинаковы. От нас требуется найти длину пути по одной из дорог и длину пути напрямик.

Входные данные:

Длина пути от развилки до N.

Выходные данные:

Длины путей по дороге и напрямик.

km171
Тесты.

Входные данные Выходные данные
[latex]n[/latex] [latex]{ s }_{ 1 }[/latex] [latex]{ s }_{ 2 }[/latex]
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

Код программы (C++).

Код программы (Java).

Решение.
Обозначим развилку как [latex]A[/latex], деревню [latex]N[/latex] как [latex]B[/latex], село [latex]NN[/latex] как [latex]C[/latex], место пересечения правой дороги с рельсами как D, и проведём [latex]DH\bot AB[/latex] и [latex]DK\bot BC[/latex]. Нам дано, что [latex]AB=n[/latex], угол [latex]BAC[/latex] — 60 градусов, [latex]AD=DC[/latex] и [latex]AB+BC=AD+CD[/latex].

Пусть [latex]AD=2x[/latex], тогда [latex]AH=x[/latex]; [latex]BH=KD=n-x[/latex]; [latex]BC=4x-n[/latex]; Из треугольника [latex]AHD[/latex]: [latex]BK=DH=x\cdot \sqrt { 3 } [/latex];

[latex]KC=KB-BC=n+x\cdot (\sqrt { 3 } -4)[/latex].
Из треугольника CKD по теореме Пифагора: [latex]{ KC }^{ 2 }+{ KD }^{ 2 }={ CD }^{ 2 }[/latex]. Подставив значения, раскрыв скобки и проведя математические преобразования, получим квадратное уравнение [latex]{ x }^{ 2 }\cdot (-4\sqrt { 3 } +8)-x\cdot n\cdot (\sqrt { 3 } -5)+{ n }^{ 2 }=0[/latex].
Найдём дискриминант [latex]D={ n }^{ 2 }\cdot (6\sqrt { 3 } -4)[/latex].

[latex]KD=n-x[/latex] и [latex]KD>0[/latex], значит, [latex]n-x>0[/latex] и [latex]x<n[/latex]. Легко доказать, что для первого из корней полученного квадратного уравнения это условие не выполняется. Значит, мы имеем лишь один корень. Найдя его, мы найдём половину длины [latex]AD[/latex]. Выведем формулу для его расчёта:
[latex]x=\frac { n\cdot (5-\sqrt { 3 } -\sqrt { 6\sqrt { 3 } -4 } ) }{ 8\cdot (2-\sqrt { 3 } ) } [/latex] Тогда длина пути по дороге будет равна [latex]4x[/latex], а длину пути напрямик мы найдём из треугольника [latex]ABC[/latex] по теореме Пифагора: [latex]{ s }_{ 2 }=\sqrt { { 2\cdot (n }^{ 2 }-4x\cdot n+8{ n }^{ 2 }) } [/latex].

Код на ideone.com: здесь (C++) и здесь (Java).
Условие задачи (страница 27).

Related Images:

Ю1.14

Задача. Русские неметрические единицы длинны: 1 верста = 500 саженей; 1 сажень = 3 аршина; 1 аршин = 16 вершков; 1 вершок = 44,45 мм. Длинна некоторого отрезка составляет P метров. Перевести её в русскую неметрическую систему.

Тесты:

P(м) Результат Комментарий
 0  Длинна отрезка P равна нулю.  Пройден
 1  Длинна отрезка P — 1 аршин 6 вершков.  Пройден
 99  Длинна отрезка P — 46 саженей 1 аршин 3 вершка.  Пройден
345999 Длинна отрезка P — 324 вёрст 166 саженей 2 аршина 4 вершка.  Пройден
-9999  Не имеет смысла.  Пройден
Вот код.

 

Идея такой записи пришла мне в голову еще недели 2-3 назад. Я отлично понимаю что есть способы записать все это в более простом виде но…работает(хоть и не очень шустро) и это главное.

Из задачи ясно, что нам нужно перевести некоторый отрезок P из метров в русскую неметрическую систему измерения, в нашем случае как я понял мы должны использовать исключительно 4 меры длинны: верста, сажени, аршины и вершки. Я записал 5 переменных в тип «float» для 5-ти единиц измерения, затем для 4-х из них записал еще 4 переменные в тип «int«, обозначающие соответствующие им, но в виде целого числа переменные. Сделал я это для того чтобы все соответствующие переменные записать в виде целых чисел, а так же для того чтобы выделить разность целого числа и числа с плавающей точкой и перевести её в меньшую единицу измерения, затем сделав тоже самое с последующими переменными до тех пор пока не дойду до наименьшей единицы измерения.

 

Related Images: