新生训练赛round2--H. Can you find it?

Time Limit: 3000ms
Memory Limit: 10000KB
64-bit integer IO format: %I64d      Java class name: Main

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

----------------------------

比赛时拿到题很傻逼地直接三个循环找相等的数,结果没有疑问地TLE。
赛后才知道要用二分法。
然后又很傻逼地只对第三组数据二分查找,结果又很明显地TLE。
最后看了挑战。。。
又很傻逼地把前两组的和放入一个新的数组,对这个数组二分查找,结果就AC了。
还是要回来看看时间复杂度是个怎么样的数。

--------------------------------
code:


 
 
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       

using namespace std;

const int MAXN = 500 + 10;
int l[MAXN];
int n[MAXN];
int m[MAXN];
int ln[MAXN * MAXN];
int L,M,N;
int p = 1;

bool binary_search(int s)
{
    int l = 0,r = p-1;
    while(r - 1 >= l)
    {
        int i = (l + r) / 2;
        if(ln[i] == s) return true;
        else if(ln[i] < s) l = i + 1;
        else r = i;
    }
    return false;
}

int main()
{
    int num;
    int d = 1;
    while(scanf("%d%d%d",&L,&N,&M) != EOF)
    {
        for(int i = 0; i < L; i++) scanf("%d",&l[i]);
        for(int i = 0; i < N; i++) scanf("%d",&n[i]);
        for(int i = 0; i < M; i++) scanf("%d",&m[i]);
        p = 0;
        for(int i = 0; i < L; i++)
            for(int j = 0; j < N; j++) ln[p++] = l[i] + n[j];
        sort(ln,ln+p);
        scanf("%d",&num);
        int sum;
        printf("Case %d:\n",d++);
        while( num-- )
        {
            scanf("%d",&sum);
            int right = 0;
            for(int i = 0; i < M; i++)
            {
                if(binary_search(sum - m[i]))
                {right = 1; break;}
            }
            if(right) printf("YES\n");
            else printf("NO\n");
        }
    }
}

      
      
     
     
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值