这个题在确定距离求可以放多少头牛时,我假设了第一个摊位必放牛。感觉许多二分的题都可以类似这道题,做出一些“贪心”的假设。
#include<bits/stdc++.h>
using namespace std;
int N,C;
int stall[100001];
int f(int d){
int now=0,next=1,ans=1;
while(next<N){
if(stall[next]-stall[now]>=d){//next stall 是否可以放牛
ans++;
now=next;
next++;
}
else{
next++;
}
}
return ans;
}
int main(){
scanf("%d%d",&N,&C);
for(int i=0;i<N;i++) scanf("%d",&stall[i]);
sort(stall,stall+N);
int l=1,r=stall[N-1]-stall[0];
while(l<r){
int mid=l+(r-l)/2;
int t=f(mid);
if(t<C) r=mid;
else l=mid+1;
}
printf("%d",l-1);
}