因为自己写的时候写炸了第三个点,于是翻了题解,发现都是写l<=r
的,就我一个写l<r
。
但是我觉得我这么写没有问题。如果是l<r
,那么判定的时候,令mid=l+r>>1
,此时mid不会取到r。如果是合法的,则l=mid+1
,否则r=mid
。因此最终l会停止在刚好不合法的位置,然后输出l-1
。但是这样会WA第三个点。
下面是代码:
#include<bits/stdc++.h>
using namespace std;
long long l,n,m,d[100005],lft,rght;
bool check(int mid){
int ans=0,now=0;
for(long long i=1;i<=n+1;i++)
if(d[i]-d[now]<mid)ans++;
else now=i;
return ans<=m;
}
int main(){
cin>>l>>n>>m;
for(long long i=1;i<=n;i++)cin>>d[i];
d[0]=0,d[n+1]=l;
sort(d+1,d+n+2);
lft=0,rght=l;
while(lft<rght){
long long mid=lft+rght>>1;
if(check(mid))lft=mid+1;
else rght=mid;
}
cout<<lft-1;
return 0;
}
有谁能告诉我其中的问题?