AggressiveCows
- Place cows in stalls such that, the minimum distance between two cows is maximum.
 
- The minimum answer will always be 1 (low)
 
- The maximum answer will always be last_stall - first_stall (high) considering 2 cows are there.
 
isPossible checks in linear time if current_distance is possible for given number of cows 
aggressiveCows calls isPossible using binary search by eliminating half of probable search space on every iteration. 
bool isPossible(vector<int>& arr, int dist, int cows) {
    int last = arr[0];
    cows--;
  for (int i = 1; i < arr.size() && cows > 0; i++) {
    if (arr[i] - last >= dist) {
        last = arr[i];
        cows--;
    }
  }
  if(cows > 0)
    return false;
  return true;
}
int aggressiveCows(vector<int> &stalls, int k)
{
    sort(stalls.begin(), stalls.end());
    int low = 1;
    int high = stalls[stalls.size()-1] - stalls[0];
    while (low <= high) {
        int mid = low + (high-low)/2;
        if(isPossible(stalls, mid, k)){
            low = mid+1;
        } else {
            high = mid-1;
        }
    }
    return high;
}