题意:
和上一道题类似,只不过把倔牛换成了石头,求n-m个石头的最大的最小距离。
最大化最小值。
题解:
最大化最小值,二分!和上一道题几乎一样,这里只不过多了,最后一个固定的石头!要判定下放下去的n-m个石头,最后一个放下的石头离固定石头的距离是否>=d;
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>using namespace std;const int maxn=50005;int L,N,M;
int x[maxn];bool C(int d)
{int last=0;//放最开始的那个固定石头。int n=N-M;for(int i=0;i<n;i++)//放石头,和上一道题放倔牛差不多{int cur=last+1;while(cur<=N&&x[cur]-x[last]<d)cur++;if(cur>N)return false;last=cur;}if(x[N+1]-x[last]>=d)//最后不动的那个石头return true;else return false;
}
int main()
{cin>>L>>N>>M;for(int i=1;i<=N;i++)scanf("%d",&x[i]);x[0]=0;x[N+1]=L;sort(x,x+N+1);int lb=0,ub=L+10;//ub宽一点~否则卡边界会WA;while(ub>lb+1){int mid=(lb+ub)/2;if(C(mid))lb=mid;else ub=mid;}cout<<lb<<endl;}