hdu 2141 二分查找,三个数相加

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

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

 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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值