package main
import (
"fmt"
"sort"
)
func canPlaceCows(stalls []int, cows int, dist int) bool {
count := 1 // place first cow at first stall
lastPos := stalls[0]
for i := 1; i < len(stalls); i++ {
if stalls[i]-lastPos >= dist {
count++
lastPos = stalls[i]
if count == cows {
return true
}
}
}
return false
}
func aggressiveCows(stalls []int, cows int) int {
sort.Ints(stalls) // sort stalls
low, high := 1, stalls[len(stalls)-1]-stalls[0]
result := 0
for low <= high {
mid := (low + high) / 2
if canPlaceCows(stalls, cows, mid) {
result = mid // mid distance works
low = mid + 1 // try bigger distance
} else {
high = mid - 1 // try smaller distance
}
}
return result
}
func main() {
stalls := []int{1, 2, 4, 8, 9}
cows := 3
maxDist := aggressiveCows(stalls, cows)
fmt.Printf("Largest minimum distance = %d\n", maxDist)
}
sort.Ints(stalls) // sort stalls to check distances in order
sort stalls to check distances in order
low, high := 1, stalls[len(stalls)-1]-stalls[0]
set search range for minimum distance
choose middle distance to test
if canPlaceCows(stalls, cows, mid) {
check if cows can be placed with at least mid distance
result = mid // mid distance works
record current working distance
low = mid + 1 // try bigger distance
try to increase minimum distance
high = mid - 1 // try smaller distance
reduce distance if mid doesn't work
count := 1 // place first cow at first stall
start placing cows from first stall
if stalls[i]-lastPos >= dist {
place next cow only if distance condition met
if count == cows { return true }
all cows placed successfully
Largest minimum distance = 3