您的位置:首页 > 其它

二分查找 HDOJ 2141 Can you find it?

2015-07-25 18:12 495 查看
题目传送门

 /*
题意:给出一个数,问是否有ai + bj + ck == x
二分查找:首先计算sum[l] = a[i] + b[j],对于q,枚举ck,查找是否有sum + ck == x
*/
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

typedef long long ll;
const int MAXN = 5e2 + 10;
const int INF = 0x3f3f3f3f;
ll a[MAXN], b[MAXN], c[MAXN];
ll sum[MAXN*MAXN];
int tot;

bool my_binary_search(int l, int r, ll k)   {
while (l < r)   {
int mid = (l + r) >> 1;
if (sum[mid] == k)  return true;
else if (sum[mid] > k)  r = mid;
else    l = mid + 1;
}
return false;
}

int main(void)  {       //HDOJ 2141 Can you find it?
//freopen ("HDOJ_2141.in", "r", stdin);

int l, n, m, s, cas = 0;
while (scanf ("%d%d%d", &l, &n, &m) == 3)   {
for (int i=1; i<=l; ++i)    scanf ("%I64d", &a[i]);
for (int i=1; i<=n; ++i)    scanf ("%I64d", &b[i]);
for (int i=1; i<=m; ++i)    scanf ("%I64d", &c[i]);
scanf ("%d", &s);

printf ("Case %d:\n", ++cas);
sort (a+1, a+1+l);  sort (b+1, b+1+n);  sort (c+1, c+1+m);
tot = 0;
for (int i=1; i<=l; ++i)    {
for (int j=1; j<=n; ++j)    {
sum[++tot] = a[i] + b[j];
}
}
sort (sum+1, sum+1+tot);

ll mn = a[1] + b[1] + c[1], mx = a[l] + b
+ c[m];
while (s--) {
ll q;  scanf ("%I64d", &q);
if (q < mn || q > mx)   {
puts ("NO");    continue;
}
bool flag = false;
for (int i=1; i<=m; ++i)    {
int p = lower_bound (sum+1, sum+1+tot, q - c[i]) - sum;
if (p < 1 || p > tot)   continue;
if (sum[p] + c[i] == q) {
flag = true;    puts ("YES");   break;
}
//if (my_binary_search (1, tot, q - c[i]))    {
//flag = true;    puts ("YES");   break;
//}
}
if (!flag)  {
puts ("NO");
}
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: