HDU 2141

来源:互联网 发布:医疗软件哪个好 编辑:程序博客网 时间:2024/06/08 08:18

这是一道二分题目,一开始我没有想到怎么做,因为二分都是针对于两个变量啊!而这里有三个变量,真不懂怎么办!后来看了一位大神的博客才发现方法了,就是把任意两个数组加起来,合成一个数组,这样就是两个变量了!这思路太牛逼了!代码如下:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int maxn=505;int a[maxn],b[maxn],c[maxn],d[255555],e[maxn];int l1,r;int num;int cmp(const void *a,const void *b){    return *(int *)a-*(int *)b;}int binary_search(int t){    l1=0;    r=num-1;    while(l1<=r)    {        int mid=(l1+r)>>1;        if(d[mid]==t)        {            return 1;        }        else if(d[mid]>t)        {            r=mid-1;        }        else        {            l1=mid+1;        }    }    return 0;}int main(){    int tcase=0;    int i,j;    int l,m,n;    while(scanf("%d%d%d",&l,&m,&n)!=EOF)//这里太坑爹了,一开始我没加!=EOF就超时了!无语    {        for(i=0; i<l; i++)        {            scanf("%d",&a[i]);        }        for(i=0; i<n; i++)        {            scanf("%d",&b[i]);        }        for(i=0; i<m; i++)        {            scanf("%d",&c[i]);        }        int  dd=0;        for(i=0; i<l; i++)        {            for(j=0; j<n; j++)            {                d[dd++]=a[i]+b[j];            }        }        num=dd;        qsort(d,dd,sizeof(d[0]),cmp);        qsort(c,m,sizeof(c[0]),cmp);        int s;        int flag;        scanf("%d",&s);        printf("Case %d:\n",++tcase);        while(s--)        {            flag=0;            int k;            scanf("%d",&k);            for(i=0; i<m; i++)            {                int p;                p=k-c[i];                if(binary_search(p))                {                    flag=1;                    printf("YES\n");                    break;                }            }            if(flag==0)            {                printf("NO\n");            }        }    }    return 0;}


原创粉丝点击