Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10
Case 1: NO YES NO
/*
题解:
二分查找
做法是先将前两个数列相加产生sumAB数列,这个时候sumAB+c = k,
那么sumAB= k-c,每次询问k时,就用k减去c中的所有数,依次在sumAB数列中查找。
*/
#include <stdio.h>
#include <string.h>
#include<iostream>
#include <algorithm>
#include<math.h>
using namespace std;
int sumAB[250005];
int find(int l, int r, int ans)
{
int mid = (l + r) / 2;
if (sumAB[mid] == ans)
{
return 1;
}
else
{
if (l == r)
return 0;
if (sumAB[mid] > ans)
{
return find(l, mid, ans);
}
else
{
return find(mid + 1, r, ans);
}
}
}
int main()
{
int l, m, n;
int A[505], B[505], C[505];
int cnt = 0;
while (cin >> l >> m >> n)
{
for (int i = 0; i < l; i++)
{
scanf("%d", &A[i]);
}
for (int i = 0; i < m; i++)
{
scanf("%d", &B[i]);
}
for (int i = 0; i < n; i++)
{
scanf("%d", &C[i]);
}
int len = 0;
for (int i = 0; i < l; i++)
{
for (int j = 0; j < m; j++)
{
sumAB[len++] = A[i] + B[j];
}
}
sort(sumAB, sumAB + len);
int flag=0;
int tt;
cin >> tt;
int tempcnt = 0;
while (tt--)
{
int k;
cin >> k;
if (tempcnt == 0)
{
tempcnt = 1;
printf("Case %d:\n", ++cnt);
}
flag = 0;
for (int i = 0; i < n&&flag == 0; i++)
{
flag = find(0, len - 1, k-C[i]);
}
if (flag == 0)
{
cout << "NO" << endl;
}
else
{
cout << "YES" << endl;
}
}
}
return 0;
}