https://www.cnblogs.com/violet-acmer/p/9793209.html
题意:
有 N 块岩石,从中去掉任意 M 块后,求相邻两块岩石最小距离最大是多少?
题解:
二分答案(假设答案为res)
定义 l = 0 , r = L ;
mid = (l+r)/2 ;
判断当前答案 mid 至少需要去除多少块岩石,如果去除的岩石个数 > M,说明当前答案mid > res,r=mid;反之,说明当前答案 mid <= res , l =mid;
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=5e4+10; 6 7 int L,N,M; 8 int dist[maxn]; 9 10 bool Check(int mid) 11 { 12 int res=0; 13 int pre=0; 14 for(int i=1;i <= N;++i) 15 { 16 if(dist[i]-dist[pre] < mid) 17 res++; 18 else 19 pre=i; 20 } 21 return res <= M ? true:false; 22 } 23 int Solve() 24 { 25 sort(dist+1,dist+N+1); 26 int l=0,r=L+1; 27 while(r-l > 1) 28 { 29 int mid=l+((r-l)>>1); 30 if(Check(mid)) 31 l=mid; 32 else 33 r=mid; 34 } 35 return l; 36 } 37 int main() 38 { 39 scanf("%d%d%d",&L,&N,&M); 40 dist[0]=0; 41 for(int i=1;i <= N;++i) 42 scanf("%d",dist+i); 43 printf("%d ",Solve()); 44 return 0; 45 }