我选择用二分答案来解决

#include<bits/stdc++.h>
using namespace std;
int arr[50010]={0};
int l,n,m;
bool pd(int a)//判断是否满足移除m块岩石//传入枚举的答案长度
{
    int num=0,last=0;//num记录已经移除的岩石数量,last记录上一块岩石编号
    for(int i=1;i<=n+1;i++)//遍历每个岩石
    {
        if((arr[i]-arr[last])<a)//如果跳到当前岩石的距离比传入答案小,则不能跳该岩石
        {
            num++;
        }
        else//记录岩石位置
        {
            last=i;
        }
    }
    return num<=m;//为假则说明当前枚举答案过大
}
int main()
{
    cin>>l>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>arr[i];
    }
    arr[n+1]=l;//最后一块岩石即终点
    int lp=0,rp=l,mid=0;//二分答案
    while(lp<=rp)
    {
        mid=(lp+rp)/2;
        if(pd(mid))
        {
            lp=mid+1;
        }
        else
        {
            rp=mid-1;
        }
    }
    cout<<rp<<endl;
}