将两个数组放倒一个大的数组中,然后二分查找它;
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 500+10;
int a[maxn], b[maxn], c[maxn];
int s[maxn*maxn*maxn];
int main()
{
int l, n, m;
int g = 0;
while(scanf("%d%d%d", &l, &n, &m)!=EOF)
{
for(int i = 0; i < l; i++)
scanf("%d", a+i);
int k = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", b+i);
for(int j = 0; j < l; j++)
s[k++] = a[j]+b[i];
}
for(int i = 0; i < m; i++)
scanf("%d", c+i);
sort(s, s+k);
sort(c, c+m);
printf("Case %d:\n", ++g);
int h;
scanf("%d", &h);
for(int i = 0; i < h; i++)
{
int x;
int mid;
scanf("%d", &x);
bool flag = 0;
for(int j = 0; j < m; j++)
{
int rt = k;
int lt = 0;
while(1)
{
mid = (lt+rt)/2;
if(lt==rt) break;
if(s[mid]+c[j] < x) lt = mid+1;
else rt = mid;
if(s[mid]+c[j] == x)
{
flag =1;
break;
}
}
if(flag) break;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
}
}
hdu2142
最新推荐文章于 2017-04-18 09:19:31 发布