#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool canPlaceCows(const vector<int>& stalls, int cows, int dist) {
int count = 1; // place first cow at first stall
int last_pos = stalls[0];
for (int i = 1; i < stalls.size(); i++) {
if (stalls[i] - last_pos >= dist) {
count++;
last_pos = stalls[i];
if (count == cows) return true; // all cows placed
}
}
return false; // not all cows placed
}
int aggressiveCowsMaxMinDist(vector<int>& stalls, int cows) {
sort(stalls.begin(), stalls.end());
int low = 1;
int high = stalls.back() - stalls.front();
int result = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (canPlaceCows(stalls, cows, mid)) {
result = mid; // mid distance possible
low = mid + 1; // try for bigger distance
} else {
high = mid - 1; // try smaller distance
}
}
return result;
}
int main() {
vector<int> stalls = {1, 2, 4, 8, 9};
int cows = 3;
int maxDist = aggressiveCowsMaxMinDist(stalls, cows);
cout << "Maximum minimum distance = " << maxDist << endl;
return 0;
}sort(stalls.begin(), stalls.end());
sort stalls to check distances in order
binary search over possible distances
int mid = low + (high - low) / 2;
check middle distance candidate
if (canPlaceCows(stalls, cows, mid)) {
if cows can be placed with at least mid distance
result = mid; low = mid + 1;
record mid as possible answer and try bigger distance
try smaller distance if mid not possible
int count = 1; int last_pos = stalls[0];
place first cow at first stall
if (stalls[i] - last_pos >= dist) { count++; last_pos = stalls[i]; }
place next cow if distance condition met
if (count == cows) return true;
all cows placed successfully
Maximum minimum distance = 3