二分输出left还是mid??
查看原帖
二分输出left还是mid??
332549
幽灵特工楼主2021/4/7 16:15

请看经典跳石头:

跳石头

#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,为什么会这样?

2021/4/7 16:15
加载中...