题意:
和上一道题类似,只不过把倔牛换成了石头,求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;
}