码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-23 17:13:40      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:

在三个数组中各选一个数,判断相加是否能得到目标数。一开始想暴力发现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

 

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

标签:

原文地址:http://www.cnblogs.com/luxiaoming/p/4670953.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!