Find maximum distance between any city and station - GeeksforGeeks

14 May, 2021
Given the number of cities n numbered from 0 to n-1 and the cities in which stations are located, the task is to find the maximum distance between any city and its nearest station. Note that the cities with stations can be given in any order.Examples:  
Input: numOfCities = 6, stations = [1, 4]
Output: 1

Input: numOfCities = 6, stations = [3]
Output: 3

Input: numOfCities = 6, stations = [3, 1]
Output: 2
 
The below figure represents the first example containing 6 cities and the cities with stations highlighted with green color. In this case, the farthest cities from their nearest stations are 0, 2, 3, and 5 each at a distance of 1. Hence, the maximum distance is 1.In the second example, the farthest city from its nearest station is 0 which is at a distance of 3. Hence, the maximum distance is 3.In the third example, the farthest city from its nearest station is 5 which is at a distance of 2. Hence, the maximum distance is 2.
The below figure represents the first example containing 6 cities and the cities with stations highlighted with green color. In this case, the farthest cities from their nearest stations are 0, 2, 3, and 5 each at a distance of 1. Hence, the maximum distance is 1.
In the second example, the farthest city from its nearest station is 0 which is at a distance of 3. Hence, the maximum distance is 3.
In the third example, the farthest city from its nearest station is 5 which is at a distance of 2. Hence, the maximum distance is 2.
Approach: There are three possible cases in this problem: 
When the farthest city is between two stations.When the farthest city is on the left side of the first station.When the farthest city is on the right side of the last station.
When the farthest city is between two stations.
When the farthest city is on the left side of the first station.
When the farthest city is on the right side of the last station.
Below is the algorithm to solve the above problem: 
Initialize a boolean array of size n (number of cities) with False. Then mark the values of cities with stations as True
Initialize a variable dist with 0. Initialize another variable maxDist with a value that is equal to the first city with the station (used for case 2).
Start looping through all the cities one by one.
If the current city has a station, then assign the maximum of (dist+1)//2 and maxDist to maxDist (used for case 1). Also, assign 0 to dist.
Else, increment dist.
In the end, return the maximum of dist and maxDist (used for case 3).
Below is the implementation of the above approach:  
C++
Java
Python
C#
PHP
Javascript
// C++ program to calculate the maximum // distance between any city// and its nearest station#include<bits/stdc++.h>  using namespace std;  // Function to calculate the maximum // distance between any city and its nearest stationint findMaxDistance(int numOfCities,int station[],int n){     // Initialize boolean list    bool hasStation[numOfCities + 1] = {false};          // Assign True to cities containing station    for (int city = 0; city < n; city++)    {        hasStation[station[city]] = true;    }              int dist = 0;    int maxDist = INT_MAX;      for(int i = 0; i < n; i++)    {        maxDist = min(station[i],maxDist);    }      for (int city = 0; city < numOfCities; city++)    {        if (hasStation[city] == true)        {            maxDist = max((dist + 1) / 2, maxDist);            dist = 0;        }        else            dist += 1;    }    return max(maxDist, dist);}   //Driver codeint main(){     int numOfCities = 6;    int station[] = {3, 1};    int n = sizeof(station)/sizeof(station[0]);      cout << "Max Distance:" << findMaxDistance(numOfCities,                                                station, n);}  //This code is contributed by Mohit Kumar 29
// Java program to calculate the maximum // distance between any city// and its nearest stationimport java.util.*;  class GFG{  // Function to calculate the maximum // distance between any city and its nearest stationstatic int findMaxDistance(int numOfCities,                            int station[],int n){     // Initialize boolean list    boolean hasStation[] = new boolean[numOfCities + 1];          // Assign True to cities containing station    for (int city = 0; city < n; city++)    {    hasStation[station[city]] = true;    }              int dist = 0;    int maxDist = Integer.MAX_VALUE;      for(int i = 0; i < n; i++)    {        maxDist = Math.min(station[i],maxDist);    }      for (int city = 0; city < numOfCities; city++)    {        if (hasStation[city] == true)        {            maxDist = Math.max((dist + 1) / 2, maxDist);            dist = 0;        }        else            dist += 1;    }    return Math.max(maxDist, dist);}   //Driver codepublic static void main(String args[]){     int numOfCities = 6;    int station[] = {3, 1};    int n = station.length;      System.out.println("Max Distance:"+        findMaxDistance(numOfCities,station, n));}}  // This code is contributed by// Surendra_Gnagwar
# Python3 code to calculate the maximum # distance between any city and its nearest station  # Function to calculate the maximum # distance between any city and its nearest stationdef findMaxDistance(numOfCities, station):          # Initialize boolean list    hasStation = [False] * numOfCities    # Assign True to cities containing station    for city in station:        hasStation[city] = True              dist, maxDist = 0, min(station)      for city in range(numOfCities):        if hasStation[city] == True:            maxDist = max((dist + 1) // 2, maxDist)            dist = 0                      else:            dist += 1                  return max(maxDist, dist)      numOfCities = 6station = [3, 1]print("Max Distance:", findMaxDistance(numOfCities, station))
// C# program to calculate the maximum // distance between any city // and its nearest station using System;  class GFG {   // Function to calculate the maximum // distance between any city and its nearest station static int findMaxDistance(int numOfCities,                             int []station,int n) {     // Initialize boolean list     bool []hasStation = new bool[numOfCities + 1];           // Assign True to cities containing station     for (int city = 0; city < n; city++)     {         hasStation[station[city]] = true;     }               int dist = 0;     int maxDist = int.MaxValue;       for(int i = 0; i < n; i++)     {         maxDist = Math.Min(station[i],maxDist);     }       for (int city = 0; city < numOfCities; city++)     {         if (hasStation[city] == true)         {             maxDist = Math.Max((dist + 1) / 2, maxDist);             dist = 0;         }         else            dist += 1;     }     return Math.Max(maxDist, dist); }   // Driver code public static void Main(String []args) {     int numOfCities = 6;     int []station = {3, 1};     int n = station.Length;       Console.WriteLine("Max Distance:"+         findMaxDistance(numOfCities,station, n)); } }   // This code has been contributed by 29AjayKumar
<?php// PHP program to calculate the maximum // distance between any city// and its nearest station  // Function to calculate the maximum // distance between any city and // its nearest stationfunction findMaxDistance($numOfCities,                          $station, $n){     // Initialize boolean list    $hasStation = array_fill(0, $numOfCities + 1,                                           false);          // Assign True to cities containing station    for ($city = 0; $city < $n; $city++)    {        $hasStation[$station[$city]] = true;    }              $dist = 0;    $maxDist = PHP_INT_MAX;      for($i = 0; $i < $n; $i++)    {        $maxDist = min($station[$i], $maxDist);    }      for ($city = 0;          $city < $numOfCities; $city++)    {        if ($hasStation[$city] == true)        {            $maxDist = max((int)(($dist + 1) / 2),                                         $maxDist);            $dist = 0;        }        else            $dist += 1;    }    return max($maxDist, $dist);}   // Driver code$numOfCities = 6;$station = array(3, 1);$n = count($station);  echo "Max Distance: ".findMaxDistance($numOfCities,                                      $station, $n);  // This code is contributed by mits?>
<script>  // Javascript program to calculate the maximum // distance between any city// and its nearest station  // Function to calculate the maximum // distance between any city and its nearest stationfunction findMaxDistance(numOfCities,station,n){     // Initialize boolean list    var hasStation = Array(numOfCities+1).fill(false);          // Assign True to cities containing station    for (var city = 0; city < n; city++)    {        hasStation[station[city]] = true;    }              var dist = 0;    var maxDist = 1000000000;      for(var i = 0; i < n; i++)    {        maxDist = Math.min(station[i],maxDist);    }      for (var city = 0; city < numOfCities; city++)    {        if (hasStation[city] == true)        {            maxDist = Math.max((dist + 1) / 2, maxDist);            dist = 0;        }        else            dist += 1;    }    return Math.max(maxDist, dist);}   //Driver codevar numOfCities = 6;var station = [3, 1];var n = station.length;document.write( "Max Distance: " + findMaxDistance(numOfCities,                                            station, n));    </script>    
Max Distance: 2
 
Time Complexity: O(n) Space Complexity: O(n) 
mohit kumar 29
SURENDRA_GANGWAR
29AjayKumar
Mithun Kumar
rutvik_56
Technical Scripter 2018
Competitive Programming
Greedy
Hash
Mathematical
Technical Scripter
Hash
Greedy
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Prefix Sum Array - Implementation and Applications in Competitive Programming
Ordered Set and GNU C++ PBDS
Bits manipulation (Important tactics)
What is Competitive Programming and How to Prepare for It?
7 Best Coding Challenge Websites in 2020
Dijkstra's shortest path algorithm | Greedy Algo-7
Kruskal’s Minimum Spanning Tree Algorithm | Greedy Algo-2
Prim’s Minimum Spanning Tree (MST) | Greedy Algo-5
Program for array rotation
Write a program to print all permutations of a given string