hdu(2141) Can you find it?

来源:互联网 发布:雷欧奥特曼mac装备 编辑:程序博客网 时间:2024/06/05 22:45

本题要用二分查找的方法来做;

很好的一道二分+降维思想的题!

 

先把前两个数组加起来,存在map中在排序;

然后二分查找t-c[i],看是否存在;;

 

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int a[600],b[600],c[600];
int map[300000],n,m,k;
int cmp(const void *a,const void *b)
{
 return *(int*)a-*(int*)b;
}
int find (int min,int max,int sum)
{
 int mid;
 while(min<=max)
 {
  mid=(min+max)/2;
  if(map[mid]==sum)
   return 1;
  else if(map[mid]<sum)
  {
   min=mid+1;
  }
  else
   max=mid-1;
 }
 return 0;
}
int main()
{
   int i,j,h,t,p,r=1;
   while(scanf("%d%d%d",&n,&m,&k)!=EOF)
   {
    for(i=0;i<n;i++)
     scanf("%d",&a[i]);
    for(j=0;j<m;j++)
     scanf("%d",&b[j]);
    for(h=0;h<k;h++)
     scanf("%d",&c[h]);
    int ii=0;
    for(i=0;i<n;i++)
     for(j=0;j<m;j++)
      map[ii++]=a[i]+b[j];
     qsort(map,ii,sizeof(map[0]),cmp);
    scanf("%d",&p);
    printf("Case %d:\n",r++);
    while(p--)
    {
     scanf("%d",&t);
     int flag=0;
     for(i=0;i<h;i++)
     {
      if(find(0,ii-1,t-c[i]))
       flag=1;
     }
     if(flag)
     printf("YES\n");
     else
     printf("NO\n");
    }
   }
   return 0;
}