您的位置:首页 > 其它

Can you find it? hdu2141 二分查找

2010-04-28 18:48 369 查看
/*
   这个题目分在搜索的地方,最近一直在写bfs dfs, 脑子中看见题目就感觉是搜,
   其实这个题目很简单的,排序 + 二分查找就OK了
   二分一直没有写过,都是在书本上看理论知识,理论联系实际,
   这才是最重要的
*/
#include<iostream>//2395029 2010-04-28 18:42:18 Accepted 2141 390MS 1276K 1076 B C++ 悔惜晟
#include<algorithm>
#include<cstdio>
using namespace std;

int a[505], b[505], c[505];
int sumab[250005];
int l, n, m, s;
bool flag;
void search(int x)
{
 int begin;
 int end;
 int mid;
 begin = 1;
 end = l * n;
 while(begin <= end)
 {
  mid = (begin + end) / 2;
  if(sumab[mid] == x)
  {
   flag = true;
   break;
  }
  else if(sumab[mid] < x)
   begin = mid + 1;
  else
   end = mid - 1;
 }
}
int main()
{
 int i, j,  t;
 t = 1;
 int count;
 while(cin>>l>>n>>m)
 {
  for(i = 1; i <= l; i++)
   cin>>a[i];
  for(i = 1; i <= n; i++)
   cin>>b[i];
  for(i = 1; i <= m; i++)
   cin>>c[i];
  count = 1;
  for(i = 1; i <= l; i++)
  for(j = 1; j <= n; j++)
   sumab[count++] = a[i] + b[j];
  sort(&sumab[1], &sumab[1] + l *n);
  printf("Case %d:/n", t++);
  cin>>s;
  int x;
  while(s--)
  {
   cin>>x;
   flag = false;
   for(i = 1; i <= m; i++)
   {
    int ss = x - c[i];
    search(ss);
    if(flag)
     break;

   }
   if(i <= m)
    printf("YES/n");
   else
    printf("NO/n");
  }
 }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  search 2010 c