@Metralix
2017-03-31T14:40:36.000000Z
字数 819
阅读 894
二分
题目大意
分别有a,b,c三个数组,给出一个数,看这个数能不能再a,b,c,里面分别找出一个数求和得到
解题思路
输入有三个集合,要先合并两个为一,然后再对这个
合并出来的集合进行二分;
#include <stdio.h>#include <algorithm>using namespace std;int Binary_search(int ab[],int n,int x){int f,c,m;f=0;c=n-1;m=(c+f)/2;while(c>=f){m=(c+f)/2;if(ab[m]==x) return 1;else if(ab[m]>x) c=m-1;else f=m+1;}return 0;}int a[505];int b[505];int c[505];int ab[505*505];int main(){int L,N,M;int ti=1;while(scanf("%d %d %d",&L,&N,&M)!=EOF){int i,j,k,n=0;for(i=0;i<L;i++) scanf("%d",&a[i]);for(i=0;i<N;i++) scanf("%d",&b[i]);for(i=0;i<M;i++) scanf("%d",&c[i]);for(i=0;i<L;i++){for(j=0;j<N;j++){ab[n++]=a[i]+b[j];}}sort(ab,ab+n);//for(i=0;i<n;i++) printf("%d",ab[i]);scanf("%d",&k);printf("Case %d:\n",ti++);while(k--){int x,p=1;scanf("%d",&x);for(j=0;j<M;j++){if(Binary_search(ab,n,x-c[j])){printf("YES\n");p=0;break;}}if(p) printf("NO\n");}}return 0;}