@Metralix
2017-03-31T22:40:36.000000Z
字数 819
阅读 759
二分
题目大意
分别有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;
}