Encuentre la distancia máxima posible desde el origen usando puntos dados

Dados N puntos bidimensionales. La tarea es encontrar la distancia máxima posible desde el origen usando puntos dados. Usando el i -ésimo punto (x i , y i ) uno puede moverse de (a, b) a (a + x i , b + y i )
Nota: N se encuentra entre 1 y 1000 y cada punto se puede usar como máximo una vez.
Ejemplos: 
 

Entrada: arr[][] = {{1, 1}, {2, 2}, {3, 3}, {4, 4}} 
Salida: 14.14 
El punto más lejano al que podemos movernos es (10, 10).
Entrada: arr[][] = {{0, 10}, {5, -5}, {-5, -5}} 
Salida: 10,00 
 

Enfoque: La observación clave es que cuando los puntos se ordenan por los ángulos que forman sus vectores con el eje x, la respuesta incluirá vectores en algún rango contiguo. Una prueba de este hecho se puede leer desde aquí . Entonces, la solución es bastante fácil de implementar. Iterar sobre todos los rangos posibles y calcular las respuestas para cada uno de ellos, tomando el máximo como resultado. Cuando se implementa adecuadamente, se trata de un enfoque O(N 2 ).
A continuación se muestra la implementación del enfoque anterior:
 

CPP

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum possible
// distance from origin using given points.
void Max_Distance(vector<pair<int, int> >& xy, int n)
{
    // Sort the points with their tan angle
    sort(xy.begin(), xy.end(), [](const pair<int, int>&l,
                                  const pair<int, int>& r) {
        return atan2l(l.second, l.first)
               < atan2l(r.second, r.first);
    });
 
    // Push the whole vector
    for (int i = 0; i < n; i++)
        xy.push_back(xy[i]);
 
    // To store the required answer
    int res = 0;
 
    // Find the maximum possible answer
    for (int i = 0; i< n; i++) {
        int x = 0, y = 0;
        for (int j = i; j <i + n; j++) {
            x += xy[j].first;
            y += xy[j].second;
            res = max(res, x * x + y * y);
        }
    }
 
    // Print the required answer
    cout << fixed << setprecision(2) << sqrtl(res);
}
 
// Driver code
int main()
{
    vector<pair<int, int>> vec = { { 1, 1 },
                                    { 2, 2 },
                                    { 3, 3 },
                                    { 4, 4 } };
 
    int n = vec.size();
 
    // Function call
    Max_Distance(vec, n);
 
    return 0;
}

Javascript

// JavaScript implementation of the approach
 
// Function to implement the custom sort
function myCustomSort(l, r){
    return Math.atan2(l[1], l[0]) < Math.atan2(r[1], r[0]);
}
 
// Function to find the maximum possible
// distance from origin using given points.
function Max_Distance(xy, n)
{
    // Sort the points with their tan angle
    xy.sort(myCustomSort);
 
    // Push the whole vector
    for (let i = 0; i < n; i++)
        xy.push(xy[i]);
 
    // To store the required answer
    let res = 0;
 
    // Find the maximum possible answer
    for (let i = 0; i< n; i++) {
        let x = 0, y = 0;
        for (let j = i; j <i + n; j++) {
            x += xy[j][0];
            y += xy[j][1];
            res = Math.max(res, x * x + y * y);
        }
    }
 
    // Print the required answer
    console.log(Math.sqrt(res).toFixed(2));
 
}
 
// Driver code
let vec = [[1, 1],
           [2, 2],
           [3, 3],
           [4, 4]];
 
let n = vec.length;
 
// Function call
Max_Distance(vec, n);
 
// The code is contributed by Gautam goel (gautmgoel962)
Producción: 

14.14

 

Complejidad del tiempo: O(n^2)

Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por pawan_asipu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *