Условие
Электрик Геннадий, постоялец палаты номер 404 заведения «Покосившийся Скворечник», прокрался ночью к ближайшей ЛЭП, чтобы наконец воплотить в жизнь свой план – отрезать кусок провода, находящийся между двумя соседними опорами, и отомстить лживой розетке из предыдущей задачи.
Он планирует реализовать это следующим образом: сначала просто забраться на вершину одной из опор, отрезать провод, закреплённый там, после чего спуститься на некоторую высоту вниз, возможно до земли. Далее Геннадий рассчитывает воспользоваться способностями человека-паука, которые, по его убеждению, открылись в нём после недавнего удара током: он выстрелит паутиной в некоторую произвольную точку соседнего столба, оттолкнется от первого столба и спустится по дуге окружности либо до второго столба, либо до земли. Разница высот в начале и конце такого спуска не должна превышать некоторую величину $l$, иначе наш новоявленный человек-паук рискует слишком сильно разогнаться и превратиться в человека-лепёшку. Затем электрик поднимется на вершину второго столба, чтобы отрезать закреплённый там провод, и спустится на землю.
Высоты столбов – $h_1$ и $h_2$, расстояние между ними – $d$. Геннадий не очень любит лазать вверх, поэтому он хочет разработать план таким образом, чтобы суммарная дистанция подъёмов была минимально возможной. Раз уж Вы взялись помогать ему, то доведите начатое до конца!
Единственная строка ввода содержит четыре целых числа $d$, $h_1, h_2, l$ $(1 \leqslant d, h_1, h_2, l \leqslant 10^6)$.
Выведите одно число – минимальную суммарную дистанцию подъёма Геннадия с точностью не хуже $10^-5$.
Тесты
Входные данные Выходные данные
5 5 5 5 | 10.00000 |
4 5 8 5 | 10.00000 |
4 8 5 1 | 13.00000 |
3 4 6 1 | 9.00000 |
15 2 7 8 | 9.00000 |
2 5 7 11 | 7.82843 |
1 35 38 2 | 38.16228 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { double h1, h2, l, d, a, b, r; cin >> d >> a >> b >> l; h1 = min(a,b); h2 = max(a,b); double res = h1; h1 = min (h1, (h2 - ((d*d - l*l)/(2*l)))); if (h1 < 0) r = h2; else r = (sqrt(d*d + (h2-h1)*(h2-h1))); res += min(r, h2); cout << fixed << setprecision(5) << res; return 0; } |
Решение
Во-первых, поймем, что выгоднее сначала забраться на более низкий столб. Действительно, предположим, $h_1 \gt h_2$ и начинать электрик Геннадий будет с первого столба.
Заметим, что если Геннадий применит навыки человека-паука, то не сможет оказаться на втором столбе выше, чем $h_2-d$ (т.е. не выше точки $E_1$), поскольку перелетать он будет по дуге окружности, радиус которой не меньше $d$. С другой стороны, начиная с более низкого столба, он сможет перелететь в точку $E_3$ (предполагаем, что возможность воспользоваться способностью есть). При этом $H_1E_3=H_1H_2$.
Теперь сравним суммарное расстояние подъемов вверх по столбам. Если начинать с более высокого, то: $AH_1+H_2E_1=AE+H_1E+EH_2$.
С другой стороны, начиная с более низкого, получим:
$BH_2+E_3H_1=BH_2+H_1H_2$.
Заметим, что $BH_2=AE$, а по неравенству треугольника $H_1E+EH_2 \gt H_1H_2$. Отсюда и получаем, что начинать с более низкого столба экономнее.
В случае же, когда способность человека-паука применить нельзя или с её помощью Геннадий спускается до земли, не имеет значения, с какого столба начинать. Поэтому будем считать, что $h_1 \leqslant h_2$.
Забраться на более низкий столб обязательно входит в итоговую сумму. Кроме того, Геннадию либо надо будет подниматься на высоту, равную длине паутины (т.е. радиусу окружности), либо просто подняться на второй столб.
Для удобства обозначим $h_2-h_1$ через $\Delta h$, а отрезок $H_1H_2$ через $r$.
Чтобы была возможность использовать способность человека-паука, мы хотим добиться того, чтобы выполнялось следующее неравенство:
$$r — \Delta h \leqslant l $$.
Будем считать, что $h_1$ — это не высота первого столба, а высота, с которой Геннадий перелетать на второй столб (понятно, что ради удовлетворения ограничения $l$ Геннадий может только начать спускаться вниз).
Из треугольника $\Delta EH_1H_2$ выражаем $r$ :
$$r = \sqrt{d^2+\Delta h^2}.$$
Тогда неравенство принимает вид:
$$\sqrt{d^2+\Delta h^2)-\Delta h} \leqslant l,$$
$$d^2+\Delta h^2 \leqslant \frac{d^2 — l^2}{2l},$$
$$h_1 \leqslant h_2 — \frac{d^2 — l^2}{2l}.$$
Теперь понятно, что высота, с которой Геннадию надо стрелять паутиной, будет меньшим значением между выражением в правой части неравенства и высотой первого столба (в случае, если полученное нами выражение больше высоты столба, мы понимаем, что «стрелять» надо с только вершины столба).
Далее остается исключить случай, когда наше выражение отрицательное (что соответствует случаю, в котором Геннадию надо спуститься на землю и пешком перейти ко второму столбу или же на паутине перелететь только до земли, т.к. для того, чтобы совершить прыжок, удовлетворяющий ограничение $l$, герою необходимо спуститься на высоту ниже уровня земли, что невозможно).
Далее остается вычислить длину паутины по формуле $ r = \sqrt{d^2+\Delta h^2},$ принимая в качестве $h_1$ высоту, с которой надо стрелять паутиной, и прибавить полученную величину к высоте первого столба.
Решение задачи на ideone.com
Ссылка на контест
Для отправки комментария необходимо войти на сайт.