核心思路:二分答案
![](https://i-blog.csdnimg.cn/blog_migrate/c4e71602e3921c19ba79ecf107a5e978.png)
#include<iostream>
using namespace std;
int l,n,m,h[50005];//起点到终点的距离,起点和终点之间的岩石数,m
int ans;
bool check(int x){//judge函数,x代表当前二分出来的答案
int tot = 0;//tot代表计数器,记录以当前答案需要移走的实际石头数
int i = 0;//i代表下一块石头的编号
int now = 0;//now代表模拟跳石头的人当前在什么位置
while (i < n+1){//千万注意不是n,n不是终点,n+1才是
i++;
if (h[i] - h[now] < x)//判断距离,看二者之间的距离算差值就好
tot++;//判定成功,把这块石头拿走,继续考虑下一块石头
else
now = i;//判定失败,这块石头不用拿走,我们就跳过去,再考虑下一块
}
if (tot > m)
return false;
else
return true;
}
int main()
{
cin>>l>>n>>m;
for(int i=1;i<=n;i++) cin>>h[i];
h[n+1]=l;
int L=1,R=l;
while(L<=R)
{
int mid=L+R>>1;
if(check(mid))
{
ans=mid;
L=mid+1;
}
else
{
R=mid-1;
}
}
cout<<ans<<endl;
return 0;
}
okk