#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int canPlaceCows(int stalls[], int n, int cows, int dist) {
int count = 1; // place first cow at first stall
int last_pos = stalls[0];
for (int i = 1; i < n; i++) {
if (stalls[i] - last_pos >= dist) {
count++;
last_pos = stalls[i];
if (count == cows) {
return 1; // successfully placed all cows
}
}
}
return 0; // cannot place all cows with given dist
}
int aggressiveCows(int stalls[], int n, int cows) {
qsort(stalls, n, sizeof(int), compare); // sort stalls
int low = 1;
int high = stalls[n-1] - stalls[0];
int result = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (canPlaceCows(stalls, n, cows, mid)) {
result = mid; // mid is possible
low = mid + 1; // try for bigger distance
} else {
high = mid - 1; // try smaller distance
}
}
return result;
}
int main() {
int stalls[] = {1, 2, 4, 8, 9, 12};
int n = sizeof(stalls)/sizeof(stalls[0]);
int cows = 3;
int maxDist = aggressiveCows(stalls, n, cows);
printf("Maximum minimum distance = %d\n", maxDist);
return 0;
}qsort(stalls, n, sizeof(int), compare); // sort stalls
sort stalls to check distances in order
binary search over possible distances
int mid = low + (high - low) / 2;
calculate middle distance to test
if (canPlaceCows(stalls, n, cows, mid)) {
check if cows can be placed with mid distance
result = mid; low = mid + 1;
update result and try for 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 1;
all cows placed successfully
Maximum minimum distance = 4