Can you find it?
Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)
Total Submission(s): 9180 Accepted Submission(s): 2401
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
Author
wangye
Source
Recommend
数据结构:二分(折半)查找。
这道题一开始还在纳闷怎么用二分查找,后来看人家的思路才发现需要用巧办法,做法是先将前两个数列相加产生sab数列,这个时候sab+c = x,那么sab= x-c,每次询问x时,就用x减去c中的所有数,依次在sab数列中查找。
没想到这样的方法,脑子还是太木,不甘心啊 >_<
本题代码:
1 #include <iostream>
2 #include <algorithm>
3 using namespace std;
4 int qn; //sab数组总数
5 int sab[250005];
6 int binsearch(int q[],int n,int k) //二分查找
7 {
8 int left=1,right=n,mid;
9 while(left<=right){
10 mid = (left+right)/2;
11 if(q[mid]==k)
12 return mid;
13 if(q[mid]>k)
14 right = mid - 1;
15 else
16 left = mid + 1;
17 }
18 return 0;
19 }
20 int main()
21 {
22 int l,n,m;
23 int count = 1;
24 while(cin>>l>>n>>m){
25 qn = 1;
26 int A[501],B[501],C[501];
27 for(int i=1;i<=l;i++){
28 cin>>A[i];
29 }
30 for(int i=1;i<=n;i++){
31 cin>>B[i];
32 }
33 for(int i=1;i<=m;i++){
34 cin>>C[i];
35 }
36 for(int i=1;i<=l;i++)
37 for(int j=1;j<=n;j++)
38 sab[qn++] = A[i] + B[j]; //产生sab数列
39 sort(sab+1,sab+qn-1); //对sab数列进行排序
40 int s;
41 cin>>s;
42 cout<<"Case "<<count++<<":"<<endl;
43 while(s--){
44 int t;
45 cin>>t;
46 int i;
47 for(i=1;i<=m;i++){
48 int tt = t - C[i];
49 if(binsearch(sab,qn-1,tt)){ //查找有没有 x-c
50 cout<<"YES"<<endl;
51 break;
52 }
53 }
54 if(i>m)
55 cout<<"NO"<<endl;
56 }
57 }
58 return 0;
59 }
Freecode : www.cnblogs.com/yym2013