看见最小的最大或者最大的最小,考虑二分答案。以跳跃进行枚举,比它小的就丢掉,看最后丢掉的数量跟题目要求是怎样,多了距离就变小,少了就变大
#include<bits/stdc++.h>
using namespace std;
int main()
{
int l,n,m,left,right,now,i,a[50010],s,ans;
scanf("%d%d%d",&l,&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
left=0;
right=l;
int mid;
while(left<=right)
{
mid=(left+right)/2;
s=0;
now=0;
for(i=1;i<=n;i++)
{
if(a[i]-a[now]<mid)
{
s++;
}
else
{
now=i;
}
}
if(s<=m)
{
ans=mid;
left=mid+1;
}
else
{
right=mid-1;
}
}printf("%d",ans);
}