您的位置:首页 > 其它

hdu 2141

2017-06-04 12:37 246 查看
题目思路:

见题目描述;

基本思路:

降低时间复杂度;想将两个数组相加时间复杂度为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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: