Task 96. Пересечение

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.

Реализация:

C#

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

Test:

https://dotnetfiddle.net/f66QTk

Report Page