这道题也是道二分的题,主要有几个注意点:
1、两个数组的合并的问题,可以将a数组和b数组合并,这样可以降低时间复杂度。
2、二分查找的left和right的变化问题。之前这里一直wa。。。一定要是left=mid+1,right=mid-1;可以测试一下x=3和x=9以及x=10这个特殊的值。
剩下的就是二分查找的问题了。
#include"iostream" #include"stdio.h" #include"algorithm" #include"string.h" #include"cmath" #define mx 505 using namespace std; int l,m,n,s,h; int a[mx],b[mx],c[mx],ab[mx*mx],x; bool test(int xx) { int left=0; int right=h-1; while(left<=right) { int mid=(right+left)/2; if(ab[mid]==xx) return true; else if(ab[mid]>xx) right=mid-1; else left=mid+1; } return false; } int main() { int i,j,k,p; int count=0; while(scanf("%d%d%d",&l,&m,&n)==3) { count++; for(i=0;i<l;i++) cin>>a[i]; for(j=0;j<m;j++) cin>>b[j]; for(k=0;k<n;k++) cin>>c[k]; h=0; for(i=0;i<l;i++) for(j=0;j<m;j++) { ab[h++]=a[i]+b[j];//合并a和b } sort(c,c+n);sort(ab,ab+h); cout<<"Case "<<count<<":"<<endl; cin>>s; for(p=0;p<s;p++){ cin>>x; int flag=0; for(i=0;i<n;i++) { int a=x-c[i]; if(test(a)) {flag=1;break;} } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }