can you find it?

#include <stdio.h>

#include <algorithm>

using namespace std;
int ab[1000020],a[1024],b[1024],c[1024];
int find(int x,int l,int r)
{
int mid;
if(r<l) return 0;
mid=(l+r)/2;
if(ab[mid]==x) return 1;
else if(ab[mid]>x) return find(x,l,mid-1);
else return find(x,mid+1,r);
}
int main()
{
         int x,y,z,i,j,n,m,t,k,q=0;
   while(scanf("%d %d %d",&x,&y,&z)!=EOF)
        {   
                   t=0;q++;
                   for(i=0;i<x;i++)
                       {
                           scanf("%d",&a[i]);
                       }
                   for(i=0;i<y;i++)
                        {
                           scanf("%d",&b[i]);
                         }
                   for(i=0;i<z;i++)
                        {
                           scanf("%d",&c[i]);
                        }
                   for(i=0;i<x;i++)
                   {
                         for(j=0;j<y;j++)
                             {
                                   ab[t++]=a[i]+b[j];
                             }
                  }
              sort(ab,ab+t+1);
               scanf("%d",&n);
          printf("Case %d:\n",q);
          while(n--)
         {
             k=0;
            scanf("%d",&m);
           for(j=0;j<z;j++)
          {
                     if(find(m-c[j],0,t))
                      {
                              k=1;
                             continue;
                        }
          }
             if(k==1) printf("YES\n");
               else printf("NO\n");
       }
}
return 0;
}

运用了二分查找的方法;

查找前一定要排序;

函数 sort(ab,ab+t+1);  前面为数组名,后面为数组名加数组长度;

头文件

#include <algorithm>

using namespace std;

posted on 2015-05-05 17:11  l-m  阅读(199)  评论(0编辑  收藏  举报