您的位置:首页 > 其它

hdu 2141 Can you find it?(二分+枚举)

2015-03-31 20:35 381 查看

Can you find it?

Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others)

Total Submission(s): 14103 Accepted Submission(s): 3620



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




Author
wangye
题目分析:先计算出b+c,然后枚举a,看有没有b+c==x-a,hash和二分都可以,hash会快一些

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 507

using namespace std;

typedef long long LL;

int l,n,m,s;
LL x,a[MAX],b[MAX],c[MAX],p[MAX*MAX];

LL f ( LL a , LL b  )
{
    return a+b;
}

bool search ( LL a , LL x )
{
    int left = 1 , right = n*m , mid;
    while ( left != right )
    {
        mid = left + right >>1;
        if ( f(a,p[mid] ) == x ) return true;
        if ( f(a,p[mid]) < x ) left = mid+1;
        else right = mid;
    }
    return false; 
}

bool solve ( LL x )
{
    for ( int i = 1 ; i <= l ; i++ )
    {
        if ( f( a[i] , p[1] ) > x ) continue;
        if ( f( a[i] , p[n*m] ) < x ) continue;
        if ( search ( a[i] , x ) ) return true;
    }
    return false;
}

int main ( )
{
    int cc = 1;
    while ( ~scanf ( "%d%d%d" , &l , &n , &m ) )
    {
        for ( int i = 1 ; i <= l ; i++ )
            scanf ( "%I64d" , &a[i] );
        for ( int i = 1 ; i <= n ; i++ )
            scanf ( "%I64d" , &b[i] );
        for ( int i = 1 ; i <= m ; i++ )
            scanf ( "%I64d" , &c[i] );
        for ( int i = 1 ; i <= n ; i++ )
            for ( int j = 1 ; j <= m ; j++ )
                p[(i-1)*m+j] = b[i]+c[j];
        sort ( p+1 , p+n*m+1 );
        scanf ( "%d" , &s );
        printf ( "Case %d:\n" , cc++ );
        while ( s-- )
        {
            scanf ( "%I64d" , &x );
            if ( solve ( x ) ) puts ( "YES" );
            else puts ( "NO" );
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: