我选择用二分答案来解决
#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;
}

京公网安备 11010502036488号