请看经典跳石头:
#include<bits/stdc++.h>
using namespace std;
long long l,m,n,a[600000];
bool check(int x){
long long tot=0,pos=0;
for(long long i=1;i<=n+1;i++){
if(a[i]-a[pos]<=x)tot++;
else pos=i;
}
return tot<=m;
}
int main(){
cin>>l>>n>>m;
for(long long i=1;i<=n;i++){
cin>>a[i];
}
a[n+1]=l;
long long left=0,r=l,mid;
while(left<=r){
mid=(left+r)/2;
if(check(mid)){
left=mid+1;
}
else r=mid-1;
}
//if(check(left))mid=max(left,mid);
//if(check(r))mid=max(r,mid);
cout<<left;
}
其中最后一行输出left时AC,但如果去掉注释并改成输出mid则会有一个点WA,mid的值比left(正确值)小1。
我想知道为什么会这样?如果left是正确答案的话,那么注释语句中就会把mid更新为left从而AC,但并没有,所以check(left)返回的是0吗?而答案是left,为什么会这样?