Задача из журнала «Квант» №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.
Выходные данные:
Длины путей по дороге и напрямик.
№ | Входные данные | Выходные данные | |
[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++).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> #include <cmath> using namespace std; int main() { double s1, s2, n, x; cin >> n; x = n*(5-sqrt(3)-sqrt(6*sqrt(3)-4))/(8*(2-sqrt(3))); s1 = 4*x; //Длина пути по дороге s2 = sqrt(2*(n*n - 4*x*n + 8*x*x)); //Длина пути напрямик cout << s1 <<' ' << s2; return 0; } |
Код программы (Java).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import java.util.*; import java.math.*; class Main { public static void main (String[] args) { Scanner in = new Scanner(System.in); double s1, s2, n, x; n = in.nextDouble(); 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.print(s1 + " " + s2); } } |
Решение.
Обозначим развилку как [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).
— Условие задачи где? И укажите откуда взята задача.
— Вроде не так должно быть. Посмотрите здесь.
Спасибо большое. Условие подправил, решение переделал.
Зачтено, только на досуге попробуйте исправить следующее.
— Поправьте, пожалуйста, 60◦. Должно выглядеть так: 60°.
— N и NN то в latex, то без. Нужно везде одинаково и лучше в latex.
— Как добавить в тест исходную задачу с 8-ю верстами?