题:http://poj.org/problem?id=3258
思路:函数 can(int x)判断 当前的距离x能不能得到。用贪心的策略来选取N-M个点来看是否满足。
注意边界条件和边界数据:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN=50005;
int L,N,M,d[MAXN];
bool can(int mid)
{
int num=N-M;
int last=0;
for(int i=0;i<num;i++){
int cur=last+1;
while(cur<=N && d[cur]-d[last]<mid){
cur++;
}
if(cur>N) return 0;
last=cur;
}
return 1;
}
int main()
{
while(cin>>L>>N>>M)
{
if(N+M==0)
{cout<<L<<endl;continue;}
d[0]=0;
for(int i=1;i<=N;i++)
scanf("%d",&d[i]);
d[N+1]=L;
if(N==M){
cout<<L<<endl;
continue;
}
sort(d+1,d+1+N);
int lhs=0,rhs=L;
while(rhs-lhs>1)
{
int mid=(lhs+rhs)>>1;
if(can(mid)) lhs=mid;
else rhs=mid;
}
cout<<lhs<<endl;
}
return 0;
}