hdu 2141

来源:互联网 发布:林小宅的淘宝店叫什么 编辑:程序博客网 时间:2024/05/24 07:37

题目思路:

见题目描述;

基本思路:

降低时间复杂度;想将两个数组相加时间复杂度为n^2,然后排序logn,然后找n*logn,总的是n^2;

代码如下:

#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<cstdio>


using namespace std;
const int maxn = 500+10;
int num1,num2,num3;
__int64 a[maxn],b[maxn],c[maxn];
__int64 temp[250000+10];//考虑到可能一加就超出了int的范围,所以用__int64,以后如果出现蜜汁错误,可能就是数据范围出错了,勿忘是maxn*maxn;
bool bsearch(int left,int right,int value)
{
    int middle;
    while(right>left)
    {
        middle=left+(right-left)/2;
        if(temp[middle]==value) return true;
        else if(temp[middle]>value) right=middle;//这一定得注意;
        else left=middle+1;
    }
    return false;
}
int main()
{
    int cnt=1;
    while(scanf("%d%d%d",&num1,&num2,&num3)==3)
    {
        for(int i=0;i<num1;i++)
        {
            scanf("%I64d",&a[i]);
        }
        for(int j=0;j<num2;j++)
        {
            scanf("%I64d",&b[j]);
        }
        for(int k=0;k<num3;k++)
        {
            scanf("%I64d",&c[k]);
        }
        int pos=0;
        for(int j=0;j<num2;j++)
        {
            for(int k=0;k<num3;k++)
            {
                temp[pos++]=b[j]+c[k];
            }
        }
        sort(temp,temp+pos);
        int num;
        scanf("%d",&num);
        printf("Case %d:\n",cnt++);
        while(num--)
        {
            int ans;
            scanf("%d",&ans);
            int ok=0,tt;
            for(int i=0;i<num1;i++)
            {
                tt=ans-a[i];
                if(bsearch(0,pos,tt))
                {
                    ok=1;
                    break;
                }
            }
            if(ok) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}

原创粉丝点击