HDU 2141:Can you find it?(二分)

在三个数组中各选一个数,判断相加是否能得到目标数。一开始想暴力发现impossible~

联系到二分,经过学长指点才将前两个数组合并,将前两个数组所有可能的和保存在新数组中,再根据第三个数组,二分查找新数组以判断是否有所需的数

#include"cstdio"
#include"cstring"
#include"algorithm"
#define MAXN 505
using namespace std;
int sum[MAXN*MAXN];
int tail=0,p=1;
bool judge(int b,int target)
{   int low=0,high=tail-1;
    while(low<=high)
    {   int mid=(low+high)/2;
        if(sum[mid]+b==target) return true;
        else if(sum[mid]+b<target) low=mid+1;
        else high=mid-1;
    }
    return false;
}
int main()
{   int len1,len2,len3;
    while(scanf("%d%d%d",&len1,&len2,&len3)!=EOF)
    {   int num1[MAXN],num2[MAXN],num3[MAXN];
        for(int i=0;i<len1;i++) scanf("%d",&num1[i]);
        for(int i=0;i<len2;i++) scanf("%d",&num2[i]);
        for(int i=0;i<len3;i++) scanf("%d",&num3[i]);
        sort(num3,num3+len3);
        tail=0;
        memset(sum,0,sizeof(sum));
        for(int i=0;i<len1;i++)
            for(int j=0;j<len2;j++)
                sum[tail++]=num1[i]+num2[j];
        sort(sum,sum+tail);
        int n;
        scanf("%d",&n);
        printf("Case %d:\n",p++);
        while(n--)
        {   int temp,i=0,ok=0;
            scanf("%d",&temp);
            while(!ok&&i<len3)
               if(judge(num3[i++],temp)) ok=1;
            if(ok) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}
View Code

 

posted @ 2015-07-23 16:57  Septher  阅读(178)  评论(0编辑  收藏  举报