Aggressive Cows — Binary Search on Minimum Distance
Advertisement
Problem 342 · Aggressive Cows (Classic BS on Answer)
Difficulty: Hard · Pattern: BS on Answer (maximize min gap)
Place c cows in n stalls to maximize the minimum distance between any two.
Solutions
# Python
def solve(stalls, c):
stalls.sort()
def feasible(gap):
count = 1; prev = stalls[0]
for s in stalls[1:]:
if s - prev >= gap: count += 1; prev = s
return count >= c
lo, hi = 1, stalls[-1]-stalls[0]
while lo < hi:
mid = lo+(hi-lo+1)//2 # maximize
if feasible(mid): lo = mid
else: hi = mid-1
return lo
// Java
int solve(int[] stalls, int c) {
Arrays.sort(stalls);
int lo=1, hi=stalls[stalls.length-1]-stalls[0];
while (lo<hi) {
int mid=lo+(hi-lo+1)/2, cnt=1, prev=stalls[0];
for (int s:stalls) if(s-prev>=mid){cnt++;prev=s;}
if (cnt>=c) lo=mid; else hi=mid-1;
}
return lo;
}
Complexity
- Time: O(n log(max-min))
- Space: O(1)
This is Magnetic Force Between Two Balls under a different name — same pattern.
Advertisement