计算A[i]+B[j]+C[k]=x

转换为A[i]+B[i]=x-C[k] ,这样在A[i]+B[i]中二分查找,x-C[k] ,不会超时。

题目来源:

http://acm.hdu.edu.cn/showproblem.php?pid=2141

 

Can you find it?

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


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
 

 

 

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string>
 4 #include<string.h>
 5 #include<algorithm>
 6 
 7 using namespace std;
 8 int a[505],b[505],c[505];
 9 int sab[250005];
10 bool Bi_Search(int a[],int n,int b)
11 {
12     int l=0;
13     int r=n-1;
14     int mid;
15     while(l<=r)
16     {
17         mid=(l+r)>>1;
18         if(a[mid]==b)
19             return 1;
20         else if(a[mid]>b)
21             r=mid-1;
22         else
23             l=mid+1;
24     }
25     return 0;
26 }
27 int main()
28 {
29     int L,M,N;
30         int i,j,k;
31         int s;
32         int q,con=1;
33 
34     while(cin>>L>>M>>N)
35     {
36         for( i=0;i<L;i++)
37             cin>>a[i];
38         for( j=0;j<M;j++)
39             cin>>b[j];
40         for( k=0;k<N;k++)
41             cin>>c[k];
42         for(k=0,i=0;i<L;i++)
43             for(j=0;j<M;j++)
44             {
45                 sab[k++]=a[i]+b[j];
46             }
47         sort(sab,sab+k);
48 
49         cin>>s;
50         cout<<"Case "<<con++<<":"<<endl;
51         while(s--)
52         {
53             cin>>q;
54             for(j=0;j<N;j++)
55             {
56                 if(Bi_Search(sab,k,q-c[j]))
57                    break;
58             }
59             if(j==N)
60                 cout<<"NO"<<endl;
61             else
62                 cout<<"YES"<<endl;
63         }
64     }
65     return 0 ;
66 }