关于此题的烦人细节
查看原帖
关于此题的烦人细节
399250
AffineRing楼主2020/10/23 17:13

因为自己写的时候写炸了第三个点,于是翻了题解,发现都是写l<=r的,就我一个写l<r

但是我觉得我这么写没有问题。如果是l<r,那么判定的时候,令mid=l+r>>1,此时midmid不会取到rr。如果是合法的,则l=mid+1,否则r=mid。因此最终ll会停止在刚好不合法的位置,然后输出l-1。但是这样会WA\text{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;
}

有谁能告诉我其中的问题?

2020/10/23 17:13
加载中...