2019-1-28二分解法(二分搜索)
提目大意:有3组数据A,B和C,后面输入一个数字S如果在A,B,C的集合中各选一个数字相加等于S即输出”YES“否则输出“NO”
既然是二分提目,那题目肯定有时间限制,一般的暴力解法肯定过不了
代码如下
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[500],b[500],c[500],d[250010];
int main()
{
int l,n,m;
int s;
int num=1;
while(scanf("%d %d %d",&l,&n,&m)!=EOF)
{
int j;
int p;
int k=0;
for(int i=0; i<l; i++)
scanf("%d",&a[i]);
for(int i=0; i<n; i++)
scanf("%d",&b[i]);
for(int i=0; i<l; i++)
for(int j=0; j<n; j++)
d[k++]=a[i]+b[j];
sort(d,d+k);
for(int i=0; i<m; i++)
scanf("%d",&c[i]);
scanf("%d",&p);
printf("Case %d:\n",num);
for(int i=0; i<p; i++)
{
scanf("%d",&s);
int q=0;
for(j=0; j<m; j++)
{
int y=s-c[j];
int left=0,right=k-1,mid;
while(left<=right)
{
mid=(left+right)/2;
if(d[mid]==y)
{
printf("YES\n");
q=1;
break;
}
else if(d[mid]<y)
{
left=mid+1;
}
else
{
right=mid-1;
}
}
if(q==1)
break;
}
if(q!=1)
printf("NO\n");
}
num++;
}
return 0;
}