Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)
Total Submission(s): 17015 Accepted Submission(s): 4331
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Case 1: NO YES NO
题意:给出A B C三个数列,再给出一个X,问在数列中是否存在元素满足Ai+Bj+Ck=X。
典型的二分查找,先将A B两个集合相加,在使用binary_search()函数进行二分查找。
代码如下:
#include<cstdio> #include<algorithm> using namespace std; int a[510],b[510],c[510],sum[270000];//注意sum数组的下标大小,应大于500*500; int main() { int L,N,M,S,t=1,i,j,x,pos; while(scanf("%d%d%d",&L,&N,&M)!=EOF) { for(i=0;i<L;i++) scanf("%d",&a[i]); for(i=0;i<N;i++) scanf("%d",&b[i]); for(i=0;i<L;i++) { for(j=0;j<N;j++) sum[N*i+j]=a[i]+b[j]; } sort(sum,sum+L*N); for(i=0;i<M;i++) scanf("%d",&c[i]); printf("Case %d:\n",t++); scanf("%d",&S); while(S--) { int sign=0; scanf("%d",&x); for(i=0;i<M;i++) { if(binary_search(sum,sum+L*M,x-c[i])) sign=1; } if(sign) printf("YES\n"); else printf("NO\n"); } } return 0; }