这道题说明:折半查找时间复杂度低,数据可以边吸收边计算,空间复杂度低,有效的代替了暴力算法、把查找与等式相融合、
#include<stdio.h>#include<stdlib.h>int sum[250005];int com(const void *a,const void *b){ return *(int*)a-*(int *)b;}int midsearch(int key,int low,int high){ int mid; while(low<=high){ mid=(low+high)/2; if(sum[mid]==key)return 1; else if(key<sum[mid])high=mid-1; else if(key>sum[mid])low=mid+1; } return 0;}main(){ int l,n,m; int a[505],b[505],c,x; int s,cas=0; int i,k; int flag,key;
while(cas++,scanf("%d%d%d",&l,&n,&m)!=-1){ printf("Case %d:/n",cas); for(i=0;i<l;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) scanf("%d",&b[i]); k=0; while(m--){ scanf("%d",&c); for(i=0;i<n;i++) sum[k++]=c+b[i]; } qsort(sum,k,sizeof(int),com); scanf("%d",&s); while(s--){ flag=0; scanf("%d",&x); for(i=0;i<l;i++){ key=x-a[i]; if(midsearch(key,0,k-1)){ flag=1; break; } } if(flag==0) printf("NO/n"); else printf("YES/n"); } } return 0;}