A - Can you find it?(简单二分)

Can you find it?

Time limit 3000 ms Memory limit 10000 kB OS Windows


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


题意:

输入三个大小为N的数组A,B,C,然后给出X,问是否存在这样的i,j,k使得Ai+Bj+Ck=X。

解题思路:

求得前两个数组的和,遍历第三个数组,对前两个数组的和二分查找x-C[i],注意这道题不能用long long 不然会爆内存,int是足够存的。


Code:

#include <iostream>
#include <algorithm>
using namespace std;

const int maxn=500+5;
int A[maxn],B[maxn],C[maxn];
int sum[maxn*maxn];
int L,N,M;

int bs(int x)
{
    int lo=0,hi=L*N-1,mid;
    while(lo<=hi)
    {
        mid=((hi-lo)>>1)+lo;
        if(sum[mid]==x)
            return mid;
        else if(sum[mid]<x)
            lo=mid+1;
        else
            hi=mid-1;
    }
    return -1;
}

int main()
{
    int ca=1;
    while(cin>>L>>N>>M)
    {
        for(int i=0;i<L;i++)
            cin>>A[i];
        for(int i=0;i<N;i++)
            cin>>B[i];
        for(int i=0;i<M;i++)
            cin>>C[i];

        for(int i=0;i<L;i++)
            for(int j=0;j<N;j++)
                sum[i*L+j]=A[i]+B[j];
        sort(sum,sum+L*N);


        int s;

        cout<<"Case "<<ca++<<":"<<endl;
        cin>>s;
        while(s--)
        {
            int num;
            cin>>num;
            int flag=0;
            for(int i=0;i<M;i++)
            {
                if(bs(num-C[i])!=-1)
                {
                    flag=1;
                    break;
                }
            }
            if(flag)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    return 0;
}


版权声明:本文为xp731574722原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。