Compruebe si es posible llegar al punto (X, Y) usando las distancias dadas en una array

Dada una array arr[] que consta de N enteros positivos y dos enteros X e Y , la tarea es verificar si es posible llegar a (X, Y) desde (0, 0) de manera que pasar a (X f , Y f ) de (X i , Y i ) solo se permite si la distancia euclidiana entre ellos está presente en la array arr[] . Si es posible, imprima . De lo contrario, imprima No.

Nota: cada distancia presente en la array arr[] se puede usar como máximo una vez .

Ejemplos:

Entrada: arr[ ] = {2, 5}, X = 5, Y= 4
Salida:
Explicación:
Los siguientes son los movimientos necesarios para llegar de (0, 0) a (5, 4):

  1. Muévete del punto (0, 0) al (2, 0). La distancia euclidiana es sqrt((2 – 0) 2 + (0 – 0)) = 2, que está presente en la array.
  2. Muévete del punto (2, 0) al (5, 4). La distancia euclidiana es sqrt((5 – 2) 2 + (4 – 0) 2 ) = 5, que está presente en la array.

Después del conjunto de movimientos anterior, se puede llegar al punto (5, 4). Por lo tanto, imprima Sí.

Entrada: arr[] = {4}, X = 3, Y= 4
Salida: No

 

Enfoque: El problema dado se puede resolver usando las siguientes observaciones al considerar la distancia euclidiana entre los puntos (0, 0) a (X, Y) como Z = sqrt(X*X + Y*Y) , entonces el problema se puede resolver. dividido en 3 casos:

  • Si la suma del elemento de la array es menor que Z , es imposible llegar a (X, Y) mediante cualquier conjunto de movimientos.
  • Si la suma del elemento de la array es igual a Z , es posible llegar a (X, Y) después de N movimientos.
  • De lo contrario, para cada distancia, verifique las siguientes condiciones:
    • Si para cualquier A[i] , A[i] > Z + (Todas las demás distancias excepto A[i]) , entonces nunca es posible llegar a (X, Y) porque la ruta será un polígono y para un N-polígono la suma de (N – 1) lados debe ser mayor que el otro lado para cada lado posible.
    • De lo contrario, siempre es posible llegar al punto (X, Y) .

A partir de las observaciones anteriores considerando los tres casos, imprima el resultado en consecuencia.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if the point (X, Y)
// is reachable from (0, 0) or not
int isPossibleToReach(int A[], int N, int X, int Y)
{
    // Find the Euclidean Distance
    double distance = sqrt(double(X * X + Y * Y));
 
    // Calculate the maximum distance
    double mx = 0;
    for (int i = 0; i < N; i++) {
        mx += double(A[i]);
    }
 
    // Case 1.
    if (mx < distance) {
        cout << "NO";
        return 0;
    }
 
    // Case 2.
    if ((mx - distance) < 0.000001) {
        cout << "YES";
        return 0;
    }
 
    // Otherwise, check for the polygon
    // condition for each side
    for (int i = 0; i < N; i++) {
 
        if (distance + mx
            < double(2) * double(A[i])) {
            cout << "No";
            return 0;
        }
    }
 
    // Otherwise, print Yes
    cout << "Yes";
 
    return 0;
}
 
// Driver Code
int main()
{
    int A[] = { 2, 5 };
    int X = 5, Y = 4;
    int N = sizeof(A) / sizeof(A[0]);
 
    isPossibleToReach(A, N, X, Y);
 
    return 0;
}

Java

// C# program for the above approach
import java.io.*;
 
class GFG{
     
// Function to check if the point (X, Y)
// is reachable from (0, 0) or not
static int isPossibleToReach(int []A, int N,
                             int X, int Y)
{
     
    // Find the Euclidean Distance
    double distance = Math.sqrt((X * X + Y * Y));
            
    // Calculate the maximum distance
    double mx = 0;
    for(int i = 0; i < N; i++)
    {
        mx += (A[i]);
    }
 
    // Case 1.
    if (mx < distance)
    {
        System.out.print("NO");
        return 0;
    }
 
    // Case 2.
    if ((mx - distance) < 0.000001)
    {
        System.out.print("YES");
        return 0;
    }
 
    // Otherwise, check for the polygon
    // condition for each side
    for(int i = 0; i < N; i++)
    {
        if (distance + mx < 2 * A[i])
        {
            System.out.print("No");
            return 0;
        }
    }
 
    // Otherwise, print Yes
    System.out.print("Yes");
 
    return 0;
}
 
// Driver Code
public static void main (String[] args)
{
    int []A = { 2, 5 };
    int X = 5, Y = 4;
    int N = A.length;
     
    isPossibleToReach(A, N, X, Y);
}
}
 
// This code is contributed by shivanisinghss2110

Python3

# Python program for the above approach
import math
 
# Function to check if the po(X, Y)
# is reachable from (0, 0) or not
def isPossibleToReach(A, N, X, Y):
   
    # Find the Euclidean Distance
    distance = math.sqrt(X * X + Y * Y)
     
    # Calculate the maximum distance
    mx = 0
    for i in range(N):
        mx += A[i]
         
    # Case 1.
    if (mx < distance):
        print("NO")
        return 0
     
    # Case 2.
    if ((mx - distance) < 0.000001):
        print("YES")
        return 0
         
    # Otherwise, check for the polygon
    # condition for each side
    for i in range(N):
        if (distance + mx < (2) * (A[i])):
            print("No")
            return 0
             
    # Otherwise, print Yes
    print("Yes")
    return 0
 
# Driver Code
A = [2, 5]
X = 5
Y = 4
N = len(A)
 
isPossibleToReach(A, N, X, Y)
 
# This code is contributed by shivani.

C#

// C# program for the above approach
using System;
 
class GFG{
     
// Function to check if the point (X, Y)
// is reachable from (0, 0) or not
static int isPossibleToReach(int []A, int N,
                             int X, int Y)
{
     
    // Find the Euclidean Distance
    double distance = Math.Sqrt((X * X + Y * Y));
            
    // Calculate the maximum distance
    double mx = 0;
    for(int i = 0; i < N; i++)
    {
        mx += (A[i]);
    }
 
    // Case 1.
    if (mx < distance)
    {
        Console.Write("NO");
        return 0;
    }
 
    // Case 2.
    if ((mx - distance) < 0.000001)
    {
        Console.Write("YES");
        return 0;
    }
 
    // Otherwise, check for the polygon
    // condition for each side
    for(int i = 0; i < N; i++)
    {
        if (distance + mx < 2 * A[i])
        {
            Console.Write("No");
            return 0;
        }
    }
 
    // Otherwise, print Yes
    Console.Write("Yes");
 
    return 0;
}
 
// Driver Code
static public void Main ()
{
    int []A = { 2, 5 };
    int X = 5, Y = 4;
    int N = A.Length;
     
    isPossibleToReach(A, N, X, Y);
}
}
 
// This code is contributed by shivanisinghss2110

Javascript

<script>
 
        // JavaScript program for the above approach;
 
        // Function to check if the point (X, Y)
        // is reachable from (0, 0) or not
        function isPossibleToReach(A, N, X, Y)
        {
         
            // Find the Euclidean Distance
            let distance = Math.sqrt((X * X + Y * Y));
 
            // Calculate the maximum distance
            let mx = 0;
            for (let i = 0; i < N; i++) {
                mx += A[i];
            }
 
            // Case 1.
            if (mx < distance) {
                document.write("NO");
                return 0;
            }
 
            // Case 2.
            if ((mx - distance) < 0.000001) {
                document.write("YES");
                return 0;
            }
 
            // Otherwise, check for the polygon
            // condition for each side
            for (let i = 0; i < N; i++) {
 
                if (distance + mx
                    < 2 * A[i]) {
                    document.write("No");
                    return 0;
                }
            }
 
            // Otherwise, print Yes
            document.write("Yes");
 
            return 0;
        }
 
        // Driver Code
 
        let A = [2, 5];
        let X = 5, Y = 4;
        let N = A.length;
 
        isPossibleToReach(A, N, X, Y);
 
// This code is contributed by Potta Lokesh
    </script>
Producción: 

Yes

 

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por kartikmodi 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 *