Can you find it?

    Can you find it?

Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/10000 K (Java/Others)
Total Submission(s): 10424    Accepted Submission(s): 2742


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 3 1 2 3 1 2 3 1 2 3 3 1 4 10
 

Sample Output
  
  
Case 1: NO YES NO
 

[cpp]  view plain  copy
  1. #include<cstdio>  
  2. #include<algorithm>  
  3. using namespace std;  
  4. int a[505],b[505],c[505],f[250010];  
  5.   
  6. int binary(int x,int M,int k)  
  7. {  
  8.     for(int i=0; i<M; i++)  
  9.     {  
  10.         int l = 0, r = k;  
  11.         while(l <= r)  
  12.         {  
  13.             int mid = (l+r)/2;  
  14.             if(x > c[i]+f[mid]) l = mid+1;  
  15.             else if(x < c[i]+f[mid]) r = mid-1;  
  16.             else return 1;  
  17.         }  
  18.     }  
  19.     return 0;  
  20. }  
  21.   
  22. int main()  
  23. {  
  24.     int L,N,M,i,j,s,t=1;  
  25.   
  26.     while(~scanf("%d%d%d", &L,&N,&M))  
  27.     {  
  28.         for(i=0; i<L; i++)  
  29.             scanf("%d", a+i);  
  30.         for(i=0; i<N; i++)  
  31.             scanf("%d", b+i);  
  32.         for(i=0; i<M; i++)  
  33.             scanf("%d", c+i);  
  34.         int k = 0;  
  35.         for(i=0; i<L; i++)  
  36.             for(j=0; j<N; j++)  
  37.                 f[k++] = a[i]+b[j];  
  38.         sort(f,f+k);  
  39.         scanf("%d", &s);  
  40.         printf("Case %d:\n", t++);  
  41.         while(s--)  
  42.         {  
  43.             int x;  
  44.             scanf("%d", &x);  
  45.             printf(binary(x,M,k-1) ? "YES\n" : "NO\n");  
  46.         }  
  47.     }  
  48.     return 0;  
  49. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值