佬们,这个二分查找怎么救啊
查看原帖
佬们,这个二分查找怎么救啊
1291751
ShuF楼主2024/4/20 18:27

改了半天也改不明白这个二分查找(sad 太菜了,测试样例都是一半对一半错(

#include<bits/stdc++.h>
using namespace std;
void solve(){
	int n,m,k;cin>>n>>m>>k;
	
	long long int mid,ans=0,maxn=0,second;
	int times;
	int a[n+1],b[m+1],c[k+1];
	int chazhi,left,right;
	
	
	for(int i=1;i<=n;i++){
		cin>>a[i];
		chazhi=a[i]-a[i-1];
		if(chazhi==maxn) times++;//如果重复出现
		if(maxn<chazhi){//找最大区间
			second=maxn;
			maxn=chazhi;
			left=i-1;right=i;
			mid=(a[i]+a[i-1])>>1;
			times=0;//更换最大值,times清零
		}
	}
	
	
	for(int i=1;i<=m;i++) cin>>b[i];
	for(int i=1;i<=k;i++) cin>>c[i];
	sort(b+1,b+m+1);sort(c+1,c+k+1);
	
	
	int l,r,midd;int flag=0;//mid为找到的中间数,midd为二分搜索的中间数
	for(int i=1;i<=m;i++){
		l=1;r=k;midd=(l+r)>>1;
		
		while(r-l>1){//二分
			int numberr=b[i]+c[midd];
			midd=(r+l)>>1;
			
			if(numberr==mid){//如果直接查找到中间值,说明最大区间已经切成最小情况了
				ans=mid;flag=1;break;
			}//如果没找到中间值,继续二分查找
			if(numberr>mid) r=midd;
			else l=midd;
			
			ans=max(max(mid-a[left],a[right]-mid),second);//答案只可能是第二大,找到的数和区间左边的数的差值,和区间右边的数差值三选一
		}
		
		if(flag==1) break;
	}
	
	
	if(times) cout<<maxn<<endl;
	else cout<<ans<<endl;
}
int main(){
	int t;cin>>t;
	while(t--) solve();
}
2024/4/20 18:27
加载中...