杭电 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:\n",++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\n");
64             else
65                 printf("NO\n");
66         }
67     }
68 } 

 

转载于:https://www.cnblogs.com/yexiaozi/p/5707742.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值