杭电 2141 Can you find it? (二分法)

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

定义三个数组分别存a,b,c的值,再定义数组d存a和b所有可能的和,用给定的数减去c数组中的数得到k,用二分法在d数组找k值,若能找到输出yes,否则输出no。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int a[505],b[505],c[505],d[505*505];
 5 int main()
 6 {
 7     int j,l,p,m,n,i,k,t,s,num,r,le,mid,key;
 8     num=0;
 9     while(scanf("%d %d %d",&l,&m,&n)!=EOF)
10     {
11         for(i = 0 ; i < l ; i++)
12         {
13             scanf("%d",&a[i]);
14         }
15         for(i = 0 ; i < m ; i++)
16         {
17             scanf("%d",&b[i]);
18         }
19         for(i = 0 ; i < n ; i++)
20         {
21             scanf("%d",&c[i]);
22         }    
23         p=0;
24         for(i = 0 ; i < l ; i++)
25         {
26             for(j = 0 ; j < m ; j++)
27             {
28                 d[p++]=a[i]+b[j];
29             }
30         }
31         sort(c,c+n);
32         sort(d,d+p);
33         scanf("%d",&t);
34         printf("Case %d:
",++num);
35         while(t--)
36         {
37             scanf("%d",&s);
38             key=0;
39             for(i = 0 ; i < n ; i++)
40             {
41                 k=s-c[i];
42                 le=0;
43                 r=p-1;                                                      
44                 while(le <= r)
45                 {
46                     mid=(le+r)/2;
47                     if(k == d[mid])
48                     {
49                         key=-1;
50                         break;
51                     }
52                     if(k > d[mid])
53                     {
54                         le=mid+1;
55                     }
56                     else
57                     {
58                         r=mid-1;
59                     }
60                   }
61                  if(key == -1) break;
62             }
63             if(key == -1) printf("YES
");
64             else
65                 printf("NO
");
66         }
67     }
68 } 
——将来的你会感谢现在努力的自己。
原文地址:https://www.cnblogs.com/yexiaozi/p/5707742.html