O - Can you find it?

题目连接 http://acm.hust.edu.cn/vjudge/contest/121192#problem/O

题目给出了三个数组,要求判断在三个数组中能否分别找到一个数使之三个数的和等于给定的数。有三个数组,直接用三重循环太耗时,

可以先把两个数组相加求和得到一个新数组,在利用二分查找。

include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int a[505],b[505],c[505];
int dp[250025];
int main()
{
  int i,j,k,m,n,s,t,cas=0,p,flag;
  while(scanf("%d%d%d",&k,&m,&n)!=EOF)
  {
    for(i=0;i<k;i++)
      scanf("%d",&a[i]);
    for(i=0;i<m;i++)
      scanf("%d",&b[i]);
    for(i=0;i<n;i++)
      scanf("%d",&c[i]);
    p=0;
    for(i=0;i<k;i++)
      for(j=0;j<m;j++)
        dp[p++]=a[i]+b[j];
     sort(dp,dp+p);
     printf("Case %d:\n",++cas);
     scanf("%d",&t);
    while(t--)
    {
     scanf("%d",&s);   flag=0;
     for(i=0;i<n;i++)
     {
       int l=0,r=p-1,mid;
       while(l<=r)
       {
         mid=(l+r)/2;
         if(dp[mid]+c[i]==s){ flag=1;break;}
         else if(dp[mid]+c[i]<s) l=mid+1;
         else if(dp[mid]+c[i]>s) r=mid-1;
       }
       if(flag) break;
    }

    if(flag) printf("YES\n");
    else printf("NO\n");
  }
}
  return 0;
}

 

posted @ 2016-07-24 17:56  Twsc  阅读(230)  评论(0编辑  收藏  举报