Open In App

Aggressive Cows

Last Updated : 09 Nov, 2024
Summarize
Comments
Improve
Suggest changes
Share
Like Article
Like
Report

Given an array stalls[] which denotes the position of a stall and an integer k which denotes the number of aggressive cows. The task is to assign stalls to k cows such that the minimum distance between any two of them is the maximum possible.

Examples: 

Input: stalls[] = [1, 2, 4, 8, 9], k = 3
Output: 3
Explanation: We can place cow 1 at position 1, cow 2 at position 4 and cow 3 at position 9. So, the maximum possible minimum distance between two cows is 3.

Input: stalls[] = [6, 7,  9, 11, 13, 15], k = 4
Output: 2
Explanation: We can place cow 1 at position 6, cow 2 at position 9, cow 3 at position 11 and cow 4 at position 15. So, the maximum possible minimum distance between two cows is 2.

[Naive Approach] By iterating over all possible distances

The idea is to iterate over all possible distances starting from 1 up to the difference between the farthest stalls. First, we sort the array to ensure the stalls are in the correct sequence. Then, for each distance, we try to place the cows greedily - placing the first cow in the first stall and the next ones only if the gap from the last placed cow is at least the current distance. If all cows can be placed for a certain distance, we update our result. The process continues until all distances are checked.

C++
// C++ program to find maximum possible minimum distance
// between any two cows by iterating over all distances

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// function to check if we can place k cows
// with at least dist distance apart
bool check(vector<int> &stalls, int k, int dist) {
    
    // Place first cow at 0th index
    int cnt = 1;  
    int prev = stalls[0]; 
    for (int i = 1; i < stalls.size(); i++) {
        
        // If the current stall is at least dist away
        // from the previous one place the cow here
        if (stalls[i] - prev >= dist) {
            prev = stalls[i]; 
            cnt++; 
        }
    }

    // Return true if we are able to place all 'k' cows
    return (cnt >= k);
}

int aggressiveCows(vector<int> &stalls, int k) {
  
  	// sorting the array to ensure stalls in sequence
  	sort(stalls.begin(), stalls.end());
    int res = 0; 
  
  	// Minimum and maximum possible minimum distance
  	// between two stalls
    int minDist = 1;
    int maxDist = stalls.back() - stalls[0];  

    // Iterating through all possible distances 
    for (int i = minDist; i <= maxDist; i++) {
        
        // If we can place k cows with the 
        // current distance i, update the res
        if (check(stalls, k, i))
            res = i;  
    }

    return res;
}

int main() {
    vector<int> stalls = {1, 2, 4, 8, 9}; 
    int k = 3;
    int ans = aggressiveCows(stalls, k);
    cout << ans;
    return 0;
}
C
// C program to find maximum possible minimum distance
// between any two cows by iterating over all distances

#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

// function to check if we can place k cows
// with at least dist distance apart
int check(int stalls[], int size, int k, int dist) {
    
    // Place first cow at 0th index
    int cnt = 1;  
    int prev = stalls[0]; 
    for (int i = 1; i < size; i++) {
        
        // If the current stall is at least dist away
        // from the previous one place the cow here
        if (stalls[i] - prev >= dist) {
            prev = stalls[i]; 
            cnt++; 
        }
    }

    // Return true if we are able to place all 'k' cows
    return (cnt >= k);
}

int aggressiveCows(int stalls[], int size, int k) {
  
    // sorting the array to ensure stalls in sequence
    qsort(stalls, size, sizeof(int), (int (*)(const void *, const void *))compare);
    int res = 0; 
  
    // Minimum and maximum possible minimum distance
    // between two stalls
    int minDist = 1;
    int maxDist = stalls[size - 1] - stalls[0];  

    // Iterating through all possible distances 
    for (int i = minDist; i <= maxDist; i++) {
        
        // If we can place k cows with the 
        // current distance i, update the res
        if (check(stalls, size, k, i))
            res = i;  
    }

    return res;
}

int main() {
    int stalls[] = {1, 2, 4, 8, 9}; 
    int k = 3;
    int size = sizeof(stalls) / sizeof(stalls[0]);
    int ans = aggressiveCows(stalls, size, k);
    printf("%d\n", ans);
    return 0;
}
Java
// Java program to find maximum possible minimum distance
// between any two cows by iterating over all distances

import java.util.Arrays;

class GfG {
    
    // function to check if we can place k cows
    // with at least dist distance apart
    static boolean check(int[] stalls, int k, int dist) {
        
        // Place first cow at 0th index
        int cnt = 1;  
        int prev = stalls[0]; 
        for (int i = 1; i < stalls.length; i++) {
            
            // If the current stall is at least dist away
            // from the previous one place the cow here
            if (stalls[i] - prev >= dist) {
                prev = stalls[i]; 
                cnt++; 
            }
        }

        // Return true if we are able to place all 'k' cows
        return (cnt >= k);
    }

    static int aggressiveCows(int[] stalls, int k) {
        
        // sorting the array to ensure stalls in sequence
        Arrays.sort(stalls);
        int res = 0; 
        
        // Minimum and maximum possible minimum distance
        // between two stalls
        int minDist = 1;
        int maxDist = stalls[stalls.length - 1] - stalls[0];  

        // Iterating through all possible distances 
        for (int i = minDist; i <= maxDist; i++) {
            
            // If we can place k cows with the 
            // current distance i, update the res
            if (check(stalls, k, i))
                res = i;  
        }

        return res;
    }

    public static void main(String[] args) {
        int[] stalls = {1, 2, 4, 8, 9}; 
        int k = 3;
        int ans = aggressiveCows(stalls, k);
        System.out.println(ans);
    }
}
Python
# Python program to find maximum possible minimum distance
# between any two cows by iterating over all distances

# function to check if we can place k cows
# with at least dist distance apart
def check(stalls, k, dist):
    
    # Place first cow at 0th index
    cnt = 1  
    prev = stalls[0] 
    for i in range(1, len(stalls)):
        
        # If the current stall is at least dist away
        # from the previous one place the cow here
        if stalls[i] - prev >= dist:
            prev = stalls[i] 
            cnt += 1

    # Return true if we are able to place all 'k' cows
    return cnt >= k

def aggressiveCows(stalls, k):
  
    # sorting the array to ensure stalls in sequence
    stalls.sort()
    res = 0
  
    # Minimum and maximum possible minimum distance
    # between two stalls
    minDist = 1
    maxDist = stalls[-1] - stalls[0]  

    # Iterating through all possible distances 
    for i in range(minDist, maxDist + 1):
        
        # If we can place k cows with the 
        # current distance i, update the res
        if check(stalls, k, i):
            res = i  

    return res

if __name__ == "__main__":
	stalls = [1, 2, 4, 8, 9] 
	k = 3
	ans = aggressiveCows(stalls, k)
	print(ans)
C#
// C# program to find maximum possible minimum distance
// between any two cows by iterating over all distances

using System;

class GfG {
    
    // function to check if we can place k cows
    // with at least dist distance apart
    static bool check(int[] stalls, int k, int dist) {
        
        // Place first cow at 0th index
        int cnt = 1;  
        int prev = stalls[0]; 
        for (int i = 1; i < stalls.Length; i++) {
            
            // If the current stall is at least dist away
            // from the previous one place the cow here
            if (stalls[i] - prev >= dist) {
                prev = stalls[i]; 
                cnt++; 
            }
        }

        // Return true if we are able to place all 'k' cows
        return (cnt >= k);
    }

    static int aggressiveCows(int[] stalls, int k) {
      
        // sorting the array to ensure stalls in sequence
        Array.Sort(stalls);  
        int res = 0; 
        
        // Minimum and maximum possible minimum distance
        // between two stalls
        int minDist = 1;
        int maxDist = stalls[stalls.Length - 1] - stalls[0]; 

        // Iterating through all possible distances 
        for (int i = minDist; i <= maxDist; i++) {
            
            // If we can place k cows with the 
            // current distance i, update the res
            if (check(stalls, k, i))
                res = i;  
        }

        return res;
    }

    static void Main() {
        int[] stalls = {1, 2, 4, 8, 9}; 
        int k = 3;
        int ans = aggressiveCows(stalls, k);
        Console.WriteLine(ans);
    }
}
JavaScript
// JavaScript program to find maximum possible minimum distance
// between any two cows by iterating over all distances

// function to check if we can place k cows
// with at least dist distance apart
function check(stalls, k, dist) {
    
    // Place first cow at 0th index
    let cnt = 1;  
    let prev = stalls[0]; 
    for (let i = 1; i < stalls.length; i++) {
        
        // If the current stall is at least dist away
        // from the previous one place the cow here
        if (stalls[i] - prev >= dist) {
            prev = stalls[i]; 
            cnt++; 
        }
    }

    // Return true if we are able to place all 'k' cows
    return (cnt >= k);
}

function aggressiveCows(stalls, k) {
  
    // sorting the array to ensure stalls in sequence
    stalls.sort((a, b) => a - b);
    let res = 0; 
  
    // Minimum and maximum possible minimum distance
    // between two stalls
    let minDist = 1;
    let maxDist = stalls[stalls.length - 1] - stalls[0];  

    // Iterating through all possible distances 
    for (let i = minDist; i <= maxDist; i++) {
        
        // If we can place k cows with the 
        // current distance i, update the res
        if (check(stalls, k, i))
            res = i;  
    }

    return res;
}

let stalls = [1, 2, 4, 8, 9]; 
let k = 3;
let ans = aggressiveCows(stalls, k);
console.log(ans);

Output
3

Time Complexity: O(n*(MAX - MIN)), where n is the size of the array, MAX is the maximum element in the array and MIN is minimum element in the array.
Auxiliary Space: O(1).

The minimum distance between the cows has a monotonic property.

  • If we can place all the cows with a minimum distance d, then we can also place them with any smaller distance than d. The reason is by reducing the minimum gap, we can place more number of cows as lower gaps allow us to place cows even more closer.
  • If we can't place all the cows with a minimum distance d, then we can't place them with any larger distance than d. The reason is if the gap is already too large to place the cows, then larger gap will also not work.

Therefore, we can use binary search to find the maximum possible minimum distance, and to check the for any distance, we place the first cow in the first stall and the next ones only if the gap from the last placed cow is at least that distance. If all cows can be placed for a certain distance, then it is a feasible distance.


C++
// C++ program to find maximum possible minimum distance
// between any two cows using binary search

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// function to check if we can place k cows
// with at least dist distance apart
bool check(vector<int> &stalls, int k, int dist) {
    
    // Place first cow at 0th index
    int cnt = 1;  
    int prev = stalls[0]; 
    for (int i = 1; i < stalls.size(); i++) {
        
        // If the current stall is at least dist away
        // from the previous one place the cow here
        if (stalls[i] - prev >= dist) {
            prev = stalls[i]; 
            cnt++;
        }
    }

    // Return true if we are able to place all 'k' cows
    return (cnt >= k);
}

int aggressiveCows(vector<int> &stalls, int k) {
  
  	// sorting the array to ensure stalls in sequence
  	sort(stalls.begin(), stalls.end());
    int res = 0; 
  
    // Search Space for Binary Search
  	int lo = 1;
  	int hi = stalls.back() - stalls[0];
    while(lo <= hi) {
        int mid = lo + (hi - lo)/2;
        
        // If the mid ditance is possible, update
        // the result and search for larger ditance
        if(check(stalls, k, mid)) {
            res = mid;
            lo = mid + 1;
        }
        else {
            hi = mid - 1;
        }
    }
    
    return res;
}

int main() {
    vector<int> stalls = {1, 2, 4, 8, 9}; 
    int k = 3;
    int ans = aggressiveCows(stalls, k);
    cout << ans;
    return 0;
}
C
// C program to find maximum possible minimum distance
// between any two cows using binary search

#include <stdio.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

// function to check if we can place k cows
// with at least dist distance apart
int check(int stalls[], int n, int k, int dist) {
    
    // Place first cow at 0th index
    int cnt = 1;  
    int prev = stalls[0]; 
    for (int i = 1; i < n; i++) {
        
        // If the current stall is at least dist away
        // from the previous one place the cow here
        if (stalls[i] - prev >= dist) {
            prev = stalls[i]; 
            cnt++;
        }
    }

    // Return true if we are able to place all 'k' cows
    return (cnt >= k);
}

int aggressiveCows(int stalls[], int n, int k) {
  
    // sorting the array to ensure stalls in sequence
    qsort(stalls, n, sizeof(int), compare);
    int res = 0; 
  
    // Search Space for Binary Search
    int lo = 1;
    int hi = stalls[n - 1] - stalls[0];
    while(lo <= hi) {
        int mid = lo + (hi - lo) / 2;
        
        // If the mid distance is possible, update
        // the result and search for larger distance
        if(check(stalls, n, k, mid)) {
            res = mid;
            lo = mid + 1;
        }
        else {
            hi = mid - 1;
        }
    }
    
    return res;
}

int main() {
    int stalls[] = {1, 2, 4, 8, 9}; 
    int k = 3;
    int n = sizeof(stalls) / sizeof(stalls[0]);
    int ans = aggressiveCows(stalls, n, k);
    printf("%d\n", ans);
    return 0;
}
Java
// Java program to find maximum possible minimum distance
// between any two cows using binary search

import java.util.Arrays;

class GfG {

    // function to check if we can place k cows
    // with at least dist distance apart
    static boolean check(int[] stalls, int k, int dist) {
        
        // Place first cow at 0th index
        int cnt = 1;  
        int prev = stalls[0]; 
        for (int i = 1; i < stalls.length; i++) {
            
            // If the current stall is at least dist away
            // from the previous one place the cow here
            if (stalls[i] - prev >= dist) {
                prev = stalls[i]; 
                cnt++;
            }
        }

        // Return true if we are able to place all 'k' cows
        return (cnt >= k);
    }

    static int aggressiveCows(int[] stalls, int k) {
      
        // sorting the array to ensure stalls in sequence
        Arrays.sort(stalls);
        int res = 0; 
        
        // Search Space for Binary Search
        int lo = 1;
        int hi = stalls[stalls.length - 1] - stalls[0]; 

        while(lo <= hi) {
            int mid = lo + (hi - lo) / 2;
            
            // If the mid distance is possible, update
            // the result and search for larger distance
            if(check(stalls, k, mid)) {
                res = mid;
                lo = mid + 1;
            }
            else {
                hi = mid - 1;
            }
        }
        
        return res;
    }

    public static void main(String[] args) {
        int[] stalls = {1, 2, 4, 8, 9}; 
        int k = 3;
        int ans = aggressiveCows(stalls, k);
        System.out.println(ans);
    }
}
Python
# Python program to find maximum possible minimum distance
# between any two cows using binary search

def check(stalls, k, dist):
    
    # Place first cow at 0th index
    cnt = 1  
    prev = stalls[0] 
    for i in range(1, len(stalls)):
        
        # If the current stall is at least dist away
        # from the previous one place the cow here
        if stalls[i] - prev >= dist:
            prev = stalls[i] 
            cnt += 1

    # Return true if we are able to place all 'k' cows
    return cnt >= k

def aggressiveCows(stalls, k):
    
    # sorting the array to ensure stalls in sequence
    stalls.sort()
    res = 0 

    # Search Space for Binary Search
    lo = 1
    hi = stalls[-1] - stalls[0] 

    while lo <= hi:
        mid = lo + (hi - lo) // 2
        
        # If the mid distance is possible, update
        # the result and search for larger distance
        if check(stalls, k, mid):
            res = mid
            lo = mid + 1
        else:
            hi = mid - 1
    
    return res

if __name__ == "__main__":
	stalls = [1, 2, 4, 8, 9] 
	k = 3
	ans = aggressiveCows(stalls, k)
	print(ans)
C#
// C# program to find maximum possible minimum distance
// between any two cows using binary search

using System;

class GfG {
    
    // function to check if we can place k cows
    // with at least dist distance apart
    static bool check(int[] stalls, int k, int dist) {
        
        // Place first cow at 0th index
        int cnt = 1;  
        int prev = stalls[0]; 
        for (int i = 1; i < stalls.Length; i++) {
            
            // If the current stall is at least dist away
            // from the previous one place the cow here
            if (stalls[i] - prev >= dist) {
                prev = stalls[i]; 
                cnt++;
            }
        }

        // Return true if we are able to place all 'k' cows
        return (cnt >= k);
    }

    static int aggressiveCows(int[] stalls, int k) {
      
        // sorting the array to ensure stalls in sequence
        Array.Sort(stalls);
        int res = 0; 
        
        // Search Space for Binary Search
        int lo = 1;
        int hi = stalls[stalls.Length - 1] - stalls[0]; 

        while(lo <= hi) {
            int mid = lo + (hi - lo) / 2;
            
            // If the mid distance is possible, update
            // the result and search for larger distance
            if(check(stalls, k, mid)) {
                res = mid;
                lo = mid + 1;
            }
            else {
                hi = mid - 1;
            }
        }
        
        return res;
    }

    static void Main() {
        int[] stalls = {1, 2, 4, 8, 9}; 
        int k = 3;
        int ans = aggressiveCows(stalls, k);
        Console.WriteLine(ans);
    }
}
JavaScript
// JavaScript program to find maximum possible minimum distance
// between any two cows using binary search

function check(stalls, k, dist) {
    
    // Place first cow at 0th index
    let cnt = 1;  
    let prev = stalls[0]; 
    for (let i = 1; i < stalls.length; i++) {
        
        // If the current stall is at least dist away
        // from the previous one place the cow here
        if (stalls[i] - prev >= dist) {
            prev = stalls[i]; 
            cnt++;
        }
    }

    // Return true if we are able to place all 'k' cows
    return (cnt >= k);
}

function aggressiveCows(stalls, k) {
    
    // sorting the array to ensure stalls in sequence
    stalls.sort((a, b) => a - b);
    let res = 0; 

    // Search Space for Binary Search
    let lo = 1;
    let hi = stalls[stalls.length - 1] - stalls[0]; 

    while (lo <= hi) {
        let mid = Math.floor(lo + (hi - lo) / 2);
        
        // If the mid distance is possible, update
        // the result and search for larger distance
        if (check(stalls, k, mid)) {
            res = mid;
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }

    return res;
}

const stalls = [1, 2, 4, 8, 9]; 
const k = 3;
const ans = aggressiveCows(stalls, k);
console.log(ans);

Output
3

Time Complexity: O(n * log(MAX - MIN)) - where n is the size of the array, MAX is the maximum element in the array and MIN is minimum element in the array.
Auxiliary Space: O(1)


Aggressive Cows
Visit Course explore course icon
Next Article

Similar Reads