Есть простенькая олимпиадная задача, логически решение верное, но по факту не проходит
Входные данные Входной файл INPUT.TXT состоит из двух строк. На каждой строке записана информация об одной окружности – координаты ее центра x и y (целые числа, по модулю не превосходящие 5000) и радиус (целое число 1 ≤ r ≤ 1000).
Выходные данные В выходной файл OUTPUT.TXT выведите «YES», если окружности имеют хотя бы одну общую точку, и «NO» в противном случае.
Моё решение: я нахожу по формуле d = sqrt((x1-x2)^2 + (y1-y2)^2), затем отсюда вычитаю два радиуса и сравниваю с нулём, если меньше или равно нулю, значит точки пересечения есть, иначе нет, но решение проходит только частично
from math import sqrt
s = open("input.txt")
x1, y1, r1 = map(int, s.readline().split())
x2, y2, r2 = map(int, s.readline().split())
if sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) - r1 - r2 <= 0:
open("output.txt", "w").write("YES")
else:
open("output.txt", "w").write("NO")
В решении от авторов используют немного другой подход: Для начала определимся с тем, что нам известны радиусы окружностей и они равны r1 и r2. Так же по формуле расстояния между точками мы можем вычислить расстояние между центрами данных окружностей:
r = sqrt( (x2-x1)^2 + (y2-y1)^2 )
Заметим так же, что окружности будут пересекаться тогда и только тогда, когда возможен треугольник со сторонами r1, r2 и r. Фигуру, две стороны которой лежат на третьей или одна из сторон имеет нулевую длину так же будем считать треугольником, т.к. окружности могут друг друга касаться(r=r1+r2), либо полностью совпадать (r=0).
Треугольник считается возможным если сумма двух любых его сторон не меньше третьей. Т.е. в нашем случае достаточно проверить, что r1+r2>=r и r+r2>=r1 и r+r1>=r2. При этом желательно использовать вещественные типы данных. Так же можно провести аккуратное сравнение с учетом возможных погрешностей при вычислениях.
Но ведь по факту и моё решение теоретически верно, что не так подскажите...)
Ответы (1 шт):
from math import sqrt
s = open("input.txt")
x1, y1, r1 = map(int, s.readline().split())
x2, y2, r2 = map(int, s.readline().split())
if sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) - r1 - r2 <= 0 and r1 - sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) - r2 <= 0 and r2 - sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) - r1 <= 0:
open("output.txt", "w").write("YES")
else:
open("output.txt", "w").write("NO")
Добавив ещё 2 условия решение прошло все проверки, но я всё равно не понимаю почему так, ведь не обязательно использовать треугольник, предлагаемый в решении, достаточно прямой и двух радиусов, лежащих на этой прямой.