hdu 2141 Can you find it? 二分查找

三个整数数列A,B,C。给若干个数X,若能找到 Ai+Bj+Ck = X(Ai是数列A中的某一个数,Bj,Ck同理),输出YES,否则输出NO。
先是做A和B数列各元素的和并排序,接下来只要二查找X-C,就可以了。

#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include <queue>
#include <algorithm>
using namespace std;
int a[501],b[501],c[501],sum[250001],L,M,N,k;
bool find(int x)
{
    int i,low,high,t,mid;
        for(i=0;i<N;i++)
        {
        t=x-c[i];
        mid=(N-1)/2;
        low=0;high=k-1;
        while(low<=high)
        {
            if(sum[mid]==t)
            {
                printf("YES\n");
                return true;
            }
            else if(t<sum[mid])
                high=mid-1;
            else
                low=mid+1;
            mid=(low+high)/2;
        }
    }
    return false;
}
int main()
{
    int S,x,cas=1,i,j;
    while(scanf("%d%d%d",&L,&M,&N)!=EOF)
    {
        for(i=0;i<L;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]);
        k=0;
        for(i=0;i<L;i++)
        for(j=0;j<M;j++)
        sum[k++]=a[i]+b[j];
        sort(sum,sum+k);
        scanf("%d",&S);
        printf("Case %d:\n",cas++);
        while(S--)
        {
            scanf("%d",&x);
            if(!find(x))
            printf("NO\n");
        }
    }
    return 0;
}

                   

          

你可能感兴趣的:(find)