二分取整直接让条件改成l<=r,不管左右都变mid+/-1即可,然后定义变量ans=mid当函数满足的时候
#include <bits/stdc++.h>
using namespace std;
int len,n,m;
int stone[50001];
bool check(int d)//检查d是否满足条件
{
int pos=0;//初始化距离
int num=0;//表示搬走石头数量
for(int i=1;i<=n;i++)
{
if(stone[i]-pos<d)
num++;
else
pos=stone[i];//换下一块判定
}
if(num<=m) return true;
else return false;
}
int main()
{
cin>>len>>n>>m;
for(int i=1;i<=n;i++)
cin>>stone[i];
int L=0,r=len,mid;
while(L<r)//也可以让L=r,然后定义一个变量让ans=mid不变,最后输出ans即可
{
mid=(L+r)/2;
if(check(mid))//满足条件说明mid可能偏小了
L=mid+1;
else
r=mid-1;
}
if(!check(L))//要么left符合条件,要么比mid大一
cout<<L-1;
else
cout<<L;
return 0;
}