省赛跪在二分上= =,抓狂!!!
好吧,恶补基础,找些二分的来做做。
数据比较大~用二分都担心会超时,但它还是过了~~
方法比较暴力,先把两个数列合并为一个数列。
怎样合并?枚举= =,n平方。
然后得出两个数列,先给合并的数列排序。
下一步?枚举= =,枚举非合并的数列,用每个数去加合并的数列的一个数,存在==X的直接退出循环,输出“YES”;枚举所有都不合符条件的话,输出“NO”
合并的数列的那一个数怎么着,用二分。
#include <iostream>
#include <algorithm>
#define N 505
using namespace std;
int a[N],b[N],c[N],d[N*N];
int main()
{
int Case = 1, x, y, z, m, q;
while(scanf("%d%d%d",&x,&y,&z)!=EOF)
{
for(int i=0; i<x; i++) cin >> a[i];
for(int i=0; i<y; i++) cin >> b[i];
for(int i=0; i<z; i++) cin >> c[i];
int e = 0;
for(int i=0; i<y; i++)
for(int j=0; j<z; j++)
d[e++]=b[i]+c[j];
sort(a,a+x);
sort(d,d+e);
cout << "Case " << Case++ << ":" << endl;
cin >> m;
while(m--)
{
cin >> q;
int flag = 0;
int tmp;
for(int i=0; i<x; i++)
{
tmp = q - a[i];
int l = 0, r = e-1;
while(l<=r)
{
int mid = (l+r)/2;
if(d[mid] == tmp)
{
flag = 1;
break;
}
else if(d[mid] > tmp)
r = mid - 1;
else
l = mid + 1;
}
}
if(flag==1)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
return 0;
}