Как найти треугольник с максимальным периметром?

Даётся множество точек и надо найти треугольник с самым большим периметром (с вершинами в этих точках). Входные данные: 2<n<101, x и y не больше 10000

#include <iostream>
#include <math.h>

using namespace std;

struct Point
{
    int x;
    int y;
};

int main()
{
    int n; 
    double max = 0;
    cin >> n; //Вводим к-во точек
    Point *g = new Point[n];
    for (int i = 0; i < n; i++)
    {
        cin >> g[i].x >> g[i].y; //Вводим координаты каждой точки
    }
    for (int i = 0; i < n - 2; i++)
    {
        for (int h = 1 + i; h < n - 1; h++)
        {
            for (int j = 1 + h; j < n; j++)
            {
                double a = sqrt(pow(g[i].x - g[h].x, 2) + pow(g[i].y - g[h].y, 2)), b = sqrt(pow(g[i].x - g[j].x, 2) + pow(g[i].y - g[j].y, 2)), c = sqrt(pow(g[j].x - g[h].x, 2) + pow(g[j].y - g[h].y, 2)); //Считаем каждую сторону треугольника
                if (a + b > c && a + c > b && b + c > a) //Проверяем возможность существования такого треугольника
                {
                    double p = a + b + c;
                    if (p > max) //Находим максимальный периметр
                        max = p;
                }
            }
        }
    }
    cout << max;
    return 0;
}

Оно проходит 19 тестов и стопорится. Скорее всего из-за времени. Как оптимизировать код?


Ответы (1 шт):

Автор решения: Anton Shchyrov

Что сразу бросается в глаза:

Я бы один раз вычислил расстояния между всеми парами точек и записал бы в двумерный массив

→ Ссылка