版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sugarbliss/article/details/89403389
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2141
题意:给你三组数,要你各从三组数中挑出一个,满足,若满足输出YES,否则NO。
思路:先将A、B求和并排序,然后在ab数组里二分搜索x - c。注意ab数组的大小。
#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int a[N], b[N], c[N], d[N*N], cnt;
int judge(int k)
{
int l = 0, r = cnt - 1;
while(l < r)
{
int mid = (l + r) / 2;
if(d[mid] > k) r = mid;
else if(d[mid] < k) l = mid + 1;
else return 1;
}
return 0;
}
int main()
{
int k, n, m, s, x, cas = 1;
while(~scanf("%d%d%d",&k,&n,&m))
{
for(int i = 0; i < k; i++) scanf("%d",&a[i]);
for(int i = 0; i < n; i++) scanf("%d",&b[i]);
for(int i = 0; i < m; i++) scanf("%d",&c[i]);
cnt = 0;
memset(d,0,sizeof(d));
for(int i = 0; i < k; i++)
for(int j = 0; j < n; j++)
d[cnt++] = a[i] + b[j];
sort(d, d + cnt);
scanf("%d",&s);
printf("Case %d:\n",cas++);
for(int i = 0; i < s; i++)
{
scanf("%d",&x);
int flag = 0;
for(int j = 0; j < m; j++)
{
k = x - c[j];
if(judge(k))
{
flag = 1;
break;
}
}
if(flag) puts("YES");
else puts("NO");
}
}
}
/*
3 3 3
1 2 3
1 2 3
1 2 3
3
1
4
10
*/