Задать вопрос
@MAGistr_MTM
Учусь программировать

Как ускорить алгоритм?

Доброе время суток.
У меня вот такая задача: дано две точки А(х1, х2) и В(у1, у2), они соединены с началом координат О(0,0) и между собой образуя треугольник АВО. Нужно найти сколько будет таких прямоугольных треугольников удовлетворяющих условию: 0 <= x1, x2, y1, y2 <= N
Вот что у меня вышло, но мне за это стыдно(
def prod(A, B):
    return A[0]*B[0] + A[1]*B[1]

def check_triangle(x1, x2, y1, y2):
    OX = (x1, x2)
    OY = (y1, y2)
    XY = (y1 - x1, y2 - x2)
    sides = sorted([prod(OX, OX), prod(OY, OY), prod(XY,XY)], reverse = True)
    if sides[0]  ==  sides[1] + sides[2] and not 0 in sides:
        return sides

n = int(input()) + 1

def right_triangles(n):
    triangles = [[x1, x2, y1, y2] for x1 in range(n) for x2 in range(n) for y1 in range(n) for y2 in range(n) if check_triangle(x1, x2, y1, y2)]
    return len(triangles) // 2                  

print (right_triangles(n))

Есть идеи как сделать это быстрее? Буду очень благодарен за помощь.

UPD. Координаты целые числа
  • Вопрос задан
  • 891 просмотр
Подписаться 7 Оценить 1 комментарий
Ответ пользователя SilentFl К ответам на вопрос (4)
@SilentFl
Если надо найти количество прямоугольных треугольников с прямым углом в начале координат, то можно применить такой трюк: отсортировать точки в соответствии с их углом до оси OX, далее запускаем цикл, фиксируя текущую точку A[i], а вторую B (т.е. третью вершину треугольника) - ищем бинарным поиском, зная что ее угол до OX есть угол A[i]+90 градусов. Сложность снижается с ваших O(n^2) до O(nlogn).
Если треугольники считаются нужными если могут иметь прямой угол 0AB или 0BA, то ничего быстрее перебора не придумать, имхо
Ответ написан