求最小的最大,一般就都是二分答案的题。
首先,这是显然单调递增的,我们二分这个最大长度len,看能否满足条件。
具体操作也很简单,看两块石头之间是否大于了len,如果大了,就移除第二个,继续比较。
最后看一看移除的数量和m的关系就好了。
#include<bits/stdc++.h>
#define N 50000
using namespace std;
int n,m,L,l,r,mid,mx;
int A[N+5];
inline bool check(int x)
{
int i,j,tot=0;
i=1;
while(i<=n)
{
j=i;
while(A[j]-A[i-1]<x&&j<=n)tot++,j++;
i=j+1;
}
if(A[n]+x>L)tot++;
if(tot<=m)return true;
return false;
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d%d%d",&L,&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&A[i]);
check(4);
l=1,r=L;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))mx=max(mx,mid),l=mid+1;
else r=mid-1;
}
cout<<mx;
return 0;
}