HDU 2141 Can you find it?

来源:互联网 发布:c语言编辑 编辑:程序博客网 时间:2024/06/06 13:13


http://acm.hdu.edu.cn/showproblem.php?pid=2141

使用二分优化时间复杂度 将a+b的和存在一个250000的数组里。

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;int L,N,M,a[510],b[510],c[510],sum[250010],S,num;bool check(int x){    for(int i=1; i<=M; i++){        int key = x - c[i];        int l = 0, r = num - 1;        while(l <= r){            int mid = (l + r) >> 1;            if(sum[mid] > key)                r = mid - 1;            else if(sum[mid] < key)                l = mid + 1;            else                return true;        }    }    return false;}int main(){//    freopen("in.txt", "r", stdin);    int t = 0;    while(scanf("%d%d%d",&L,&N,&M) == 3){        t++;        for(int i=1; i<=L; i++) scanf("%d",&a[i]);        for(int i=1; i<=N; i++) scanf("%d",&b[i]);        for(int i=1; i<=M; i++) scanf("%d",&c[i]);        num = 0;        for(int i=1; i<=L; i++){            for(int j=1; j<=N; j++){                sum[num++] = a[i] + b[j];            }        }        sort(sum, sum+num);        scanf("%d",&S);        cout << "Case " << t << ":" << endl;//一直没看到有这个WA了好几次        int x;        for(int i=1; i<=S; i++){            scanf("%d",&x);            if(check(x))    puts("YES");            else    puts("NO");        }    }    return 0;//    int i;//    float j;//    scanf("%d%f",&i,&j);//    printf("%d %f",i,j);}

0 0