CSU暑期集训day02_A_二分法例题

题目:

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

题目大意:

    给出三组数字,要求判断指定数字能否由三组数字中各取一个相加得到。

解题思路:

    先将前两组数组相加组合成一个新的数组,时间复杂度是O(n2),然后依次枚举第三个数组中的数字,在新数组中二分查找。

代码:

#include <iostream>
#include <algorithm>

using namespace std;

int main(){
    int l,m,n;
    int coun=1;
    while(cin>>l>>n>>m){
        cout<<"Case "<<coun<<':'<<endl;
        coun++; 
        int arr[501]={-1};
        int brr[250001]={-1};
        int crr[501]={-1};
        for(int i=0;i<l;i++)cin>>arr[i];
        for(int i=0;i<n;i++){
            int b;
            cin>>b;
            for(int j=0;j<l;j++){
                brr[l*i+j]=b+arr[j];
            }             
        }
        sort(brr,brr+l*n);
        for(int i=0;i<m;i++){
            cin>>crr[i]; 
        }
        int S;
        cin>>S;
        for(int i=0;i<S;i++){
            int x;
            cin>>x;
            bool ans=false;
            for(int j=0;j<m;j++){                
                if(binary_search(brr,brr+l*n,x-crr[j])){
                    ans=true;    
                    break;
                }                
            }
            if(ans)cout<<"YES"<<endl;
            else cout<<"NO"<<endl;          
        } 
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42774699/article/details/81190646