Minimum length of square to contain at least half of the given Coordinates

• Last Updated : 11 May, 2021

Given a set of N points in the 2-D plane. The task is to find the minimum value of M such that a square centered at the origin with side 2*M contains at least floor(N/2) points inside or on it.

Examples:

Input : N = 4
Points are: {(1, 2), (-3, 4), (1, 78), (-3, -7)}
Output :
The square with end point (4, 4), (-4, -4), (4, -4), (-4, 4) will contain the points (1, 2) and (-3, 4).
Smallest Possible value of M such that the square has at least 2 points is 4.
Input : N = 3
Points are: {(1, 2), (-3, 4), (1, 78)}
Output :
Square contains the point (1, 2). {floor(3/2) = 1}

Approach:

1. One major observation for any point (x, y), minimum M in which this point lies is max(abs(x), abs(y)).
2. Using point 1. We can find the minimum value of M for all the points and store them in an array.
3. Sort the array.
4. Now, array[i] denotes minimum M such that if i points are required in the square of side 2*M. (as all the points below i have the minimum value of M less than or equal to i).
5. Print the value of array[floor(n/2)].

Below is the implementation of the above approach:

C++

 // C++ implementation of the above approach #include using namespace std; // Function to Calculate Absolute Valueint mod(int x){    if (x >= 0)        return x;    return -x;} // Function to Calculate the Minimum value of Mvoid findSquare(int n){    int points[n] = { { 1, 2 }, { -3, 4 },                       { 1, 78 }, { -3, -7 } };    int a[n];     // To store the minimum M for each    // point in array    for (int i = 0; i < n; i++) {        int x, y;        x = points[i];        y = points[i];        a[i] = max(mod(x), mod(y));    }     // Sort the array    sort(a, a + n);     // Index at which atleast required point are    // inside square of length 2*M    int index = floor(n / 2) - 1;    cout << "Minimum M required is: " << a[index] << endl;} // Driver Codeint main(){    int N;    N = 4;    findSquare(N);     return 0;}

Java

 import java.util.*; // Java program to find next identical yearclass GFG{ // Function to Calculate Absolute Valuestatic int mod(int x){    if (x >= 0)        return x;    return -x;} // Function to Calculate the Minimum value of Mstatic void findSquare(int n){    int points[][] = { { 1, 2 }, { -3, 4 },                    { 1, 78 }, { -3, -7 } };    int []a = new int[n];     // To store the minimum M for each    // point in array    for (int i = 0; i < n; i++)    {        int x, y;        x = points[i];        y = points[i];        a[i] = Math.max(mod(x), mod(y));    }     // Sort the array    Arrays.sort(a);     // Index at which atleast required point are    // inside square of length 2*M    int index = (int) (Math.floor(n / 2) - 1);    System.out.println("Minimum M required is: " + a[index]);} // Driver Codepublic static void main(String[] args){    int N;    N = 4;    findSquare(N);}} // This code contributed by Rajput-Ji

Python3

 # Python3 implementation of the# above approach # Function to Calculate the# Minimum value of Mdef findSquare(n):     points = [[1, 2], [-3, 4],              [1, 78], [-3, -7]]    a = [None] * n     # To store the minimum M    # for each point in array    for i in range(0, n):        x = points[i]        y = points[i]        a[i] = max(abs(x), abs(y))         # Sort the array    a.sort()     # Index at which atleast required    # point are inside square of length 2*M    index = n // 2 - 1    print("Minimum M required is:", a[index]) # Driver Codeif __name__ == "__main__":     N = 4    findSquare(N)     # This code is contributed# by Rituraj Jain

C#

 // C# program to find next identical yearusing System; class GFG{ // Function to Calculate Absolute Valuestatic int mod(int x){    if (x >= 0)        return x;    return -x;} // Function to Calculate the Minimum value of Mstatic void findSquare(int n){    int [,]points = new int[4,2]{ { 1, 2 }, { -3, 4 },                    { 1, 78 }, { -3, -7 } };    int []a = new int[n];     // To store the minimum M for each    // point in array    for (int i = 0; i < n; i++)    {        int x, y;        x = points[i,0];        y = points[i,1];        a[i] = Math.Max(mod(x), mod(y));    }     // Sort the array    Array.Sort(a);     // Index at which atleast required point are    // inside square of length 2*M    int index = (int) (n / 2 - 1);    Console.WriteLine("Minimum M required is: " + a[index]);} // Driver Codepublic static void Main(String []args){    int N;    N = 4;    findSquare(N);}} // This code contributed by Arnab Kundu

PHP

 = 0)        return \$x;    return -\$x;} // Function to Calculate the// Minimum value of Mfunction findSquare(\$n){    \$points = array(array( 1, 2 ),                    array( -3, 4 ),                    array( 1, 78 ),                    array( -3, -7 ));    \$a[\$n] = array();     // To store the minimum M for each    // point in array    for (\$i = 0; \$i < \$n; \$i++)    {        \$x; \$y;        \$x = \$points[\$i];        \$y = \$points[\$i];        \$a[\$i] = max(mod(\$x), mod(\$y));    }     // Sort the array    sort(\$a);     // Index at which atleast required point    // are inside square of length 2*M    \$index = floor(\$n / 2) - 1;    echo "Minimum M required is: ",                  \$a[\$index], "\n";} // Driver Code\$N = 4;findSquare(\$N); // This code is contributed by ajit.?>

Javascript


Output:
Minimum M required is: 4

My Personal Notes arrow_drop_up