HDU 2141 Can you find it?

来源:互联网 发布:那个房产软件好 编辑:程序博客网 时间:2024/05/17 06:59

Can you find it?


Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/10000 K (Java/Others)



Problem Description
Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.
 

Input
There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent the sequences B, in the forth line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.
 

Output
For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".
 

Sample Input
3 3 31 2 31 2 31 2 331410
 

Sample Output
Case 1:NOYESNO

 
#include <set>#include <map>#include <stack>#include <cmath>#include <queue>#include <cstdio>#include <bitset>#include <string>#include <vector>#include <iomanip>#include <cstring>#include <iostream>#include <algorithm>#include <functional>#define maxn 1000010using namespace std;int ab[250005];int main(){        int l,n,m,s,counter=0;        int a[505],b[505],c[505];        while(scanf("%d %d %d",&l,&n,&m)!=EOF)        {                counter++;                for(int i=0;i<l;i++)                {                        scanf("%d",&a[i]);                }                for(int i=0;i<n;i++)                {                        scanf("%d",&b[i]);                }                for(int i=0;i<m;i++)                {                        scanf("%d",&c[i]);                }                int k=0;                for(int i=0;i<l;i++)                {                        for(int j=0;j<n;j++)                        {                                ab[k++]=a[i]+b[j];                        }                }                sort(ab,ab+l*m);                scanf("%d",&s);                printf("Case %d:\n",counter);                while(s--)                {                        int num;                        scanf("%d",&num);                        int flag=0;                        for(int i=0;i<m;i++)                        {                                int need=num-c[i];                                int left=0,right=l*n-1;                                while(left<=right)                                {                                        int mid=(left+right)/2;                                        if(ab[mid]>need)                                        {                                                right=mid-1;                                        }                                        else if(ab[mid]<need)                                        {                                                left=mid+1;                                        }                                        else                                        {                                                flag=1;                                                break;                                        }                                }                                if(flag==1)                                {                                        printf("YES\n");                                        break;                                }                        }                        if(flag==0)                        {                                printf("NO\n");                        }                }        }        return 0;}


0 0
原创粉丝点击