题目算法为2分。
穷举显然超时。变换为a+b=x-c
这里需要注意的是题目中a+b在同一组中要多次使用,因此用一个另外的数组生成这个。
在a+b的数组中二分查找x-c即可。因为a+b是比x-c更大的数组。
输出大写小写搞错了,结果查了半天的代码。以后注意。
#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int M=505;
int s1[M],s2[M],s3[M];
int ss[M*M];
int bs(int l,int key)
{
int lo=0,hi=l-1;
int mid;
while(lo<=hi)
{
mid=(lo+hi)>>1;
if(ss[mid]==key)
return 1;
else if(ss[mid]>key)
hi=mid-1;
else
lo=mid+1;
}
return 0;
}
int fx(int l1,int p,int k)
{
for(int i=0;i<l1;i++)
{
if(bs(p,k-s1[i]))
return 1;
}
return 0;
}
int main()
{
//freopen("A.txt","r",stdin);学习使用这种方法输入数据
int l1,l2,l3;
int n;
int x;
int nn=1; //总的组数
while(scanf("%d%d%d",&l1,&l2,&l3)!=EOF)
{
for(int i=0;i<l1;i++)
scanf("%d",&s1[i]);
for(int i=0;i<l2;i++)
scanf("%d",&s2[i]);
for(int i=0;i<l3;i++)
scanf("%d",&s3[i]);
scanf("%d",&n);
printf("Case %d:\n",nn);
nn++;
int p=0;
for(int i=0;i<l2;i++)
for(int j=0;j<l3;j++)
ss[p++]=s2[i]+s3[j];//二分只是这个题目的一部分 这里是关键
sort(ss,ss+p); //对大的数组进行排序二分
while(n--)
{
scanf("%d",&x);
if(fx(l1,p,x))
printf("YES\n");//注意输出的大小写
else
printf("NO\n");
}
}
return 0;
}