Task 96. Пересечение
UniLecsЗадача: Дан след.рисунок (смотри ниже). Заданы значения длины отрезков n, m, h. Отрезок h перпендикулярен к отрезку w, а сам отрезок w перпендикулярен к боковым черным прямым (на рисунке прямые углы отмечены небольшим квадратиком).
Необходимо найти длину отрезка w.
Входные данные: n, m, h - положительные целые числа, не больше 1000.
Вывод: значение длины отрезка w, округлите до 2 знаков после запятой.
Пример: n = 40, m = 30, h = 10
w = ~26.03

Идея: вспоминаем геометрию, давайте введем след.обозначения (см.рисунок ниже)

И мы видим, что
- Треугольники AOH и ADC подобны, поэтому получаем след.соотношение:
h / b = AH / AC
- Треугольники COH и CBA также подобны, поэтому:
h / a = CH / CA
Из этих 2-х соотношений полуаем:
h / b + h / a = AH / AC + CH / CA = AC / AC = 1 (т.к. AH + CH = AC)
Продолжаем преобразования:
h (1/a + 1/b) = 1
h = ab / (a + b)
Дальше будем искать w = AC бинарным поиском.
Пусть 0 <= w <= min (n, m). И по заданным n, m и w найдем a, b, h.
Очевидно, что чем больше w, тем меньше h.
Реализация:

https://gist.github.com/unilecs/718dc5e781e30ece5423efe3f17cb579
Test: