hdu 2141

晕,这一题我是准备暴力的,但是这里给的数据有点大,那样是会TLE的,网上搜搜,无语啦,竟然可以这样来思考:合并前两个数组,然后再二分……

#include "stdio.h"
#include "stdlib.h"

int li[505];
int mi[505];
int ni[505];
int join[250005];

int cmp(const void *a,const void *b)
{
 int *c,*d;
 c=(int *)a;
 d=(int *)b;
 return *c-*d;
}

int main()
{
 int l,m,n;
 int s;
 int count=1;
 int i,k,j,f,a,t;
 int start,end,mid;

 while(scanf("%d%d%d",&l,&m,&n)==3)
 {
  for(i=0;i<l;i++)
  {
   scanf("%d",&li[i]);
  }

  for(i=0;i<m;i++)
  {
   scanf("%d",&mi[i]);
  }

  for(i=0;i<n;i++)
  {
   scanf("%d",&ni[i]);
  }
  k=0;
  for(i=0;i<l;i++)
  {
   for(j=0;j<m;j++)
    join[k++]=li[i]+mi[j];
  }

  qsort(join,k,sizeof(int),cmp);
  qsort(ni,n,sizeof(int),cmp);
  
  printf("Case %d:\n",count++);
  scanf("%d",&s);
  for(i=0;i<s;i++)
  {
   scanf("%d",&a);
   t=0;
   for(j=0;j<n;j++)
   {
    f=0;
    start=0;end=k-1;
    mid=(start+end)/2;
    while(start<=end)
    {
     if(a-ni[j]>join[mid])
     {
      start=mid+1;
     }
     else if(a-ni[j]<join[mid])
     {
                        end=mid-1;
     }
     else
     {
      f=1;
      break;
     }
     mid=(start+end)/2;
    }
    if(f)
    {
     t=1;
     break;
    }
   }
   if(t)
   {
    printf("YES\n");
   }
   else
   {
    printf("NO\n");
   }
  }
 }

 return 0;
}

原文地址:https://www.cnblogs.com/Shirlies/p/2358345.html