hdu 2141 Can you find it?

超时代码:

#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

int a[510],b[510],c[510];

int main()

{

    int l,n,m,s;

    int i,j,k,p,x;

    int _case=0;;

    while(scanf("%d %d %d",&l,&n,&m)!=EOF)

    {

        memset(a,0,sizeof(a));

        memset(b,0,sizeof(b));

        memset(c,0,sizeof(c));

        for(i=0;i<l;i++)

        scanf("%d",&a[i]);

        sort(a,a+l);

        for(i=0;i<n;i++)

        scanf("%d",&b[i]);

        sort(b,b+n);

        for(i=0;i<m;i++)

        scanf("%d",&c[i]);

        sort(c,c+m);

        scanf("%d",&s);

        printf("Case %d:\n",++_case);

        for(i=0;i<s;i++)

        {

            scanf("%d",&x);

            int kai=0,kai1=0;

            if(a[0]+b[0]+c[0]>=x)

            {

                if(a[0]+b[0]+c[0]==x)kai=1;

                goto RE;

            }

            if(a[l-1]+b[n-1]+c[m-1]<=x)

            {

                if(a[l-1]+b[n-1]+c[m-1]==x)kai=1;

                goto RE;

            }

            for(j=0;j<l;j++)

            {

                if(a[j]>x)break;

                for(k=0;k<n;k++)

                {

                    if(a[j]+b[k]>x)

                    {

                        kai1=1;

                        break;

                    }

                    for(p=0;p<m;p++)

                    {

                        if(a[j]+b[k]+c[p]==x)

                        {

                            kai=1;

                            break;

                        }

                    }

                    if(kai==1)break;

                }

                if(kai1==1||kai==1)break;

            }

            RE:

            if(kai==1)printf("YES\n");

            else printf("NO\n");

        }

    }

    return 0;

}
View Code

WA:

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<vector>

using namespace std;

int a[510],b[510],c[510],si[1010];

int search(int LN[],int h,int t)

{

    int mid,front=0,back=h-1;

    while(front<=back)

    {

        mid=(front+back)/2;

        if(LN[mid]==t)

            return 1;

        if(LN[mid]<t)

            front=mid+1;

        else

            back=mid-1;

    }

    return 0;

}



int main()

{

    int l,n,m,s;

    int i,j,k,p,x;

    int _case=0;;

    while(scanf("%d %d %d",&l,&n,&m)!=EOF)

    {

        memset(a,0,sizeof(a));

        memset(b,0,sizeof(b));

        memset(c,0,sizeof(c));

        for(i=0; i<l; i++)

            scanf("%d",&a[i]);

        sort(a,a+l);

        //printf("%d\n\n",a[2]);

        for(i=0; i<n; i++)

            scanf("%d",&b[i]);

        sort(b,b+n);

        for(i=0; i<m; i++)

            scanf("%d",&c[i]);

        sort(c,c+m);

        scanf("%d",&s);

        for(i=0;i<s;i++)

        scanf("%d",&si[i]);

        printf("Case %d:\n",++_case);

        for(i=0; i<s; i++)

        {

            x=si[i];

            int kai=0;

            if(a[0]+b[0]+c[0]>=x)

            {

                if(a[0]+b[0]+c[0]==x)kai=1;

                goto RE;

            }

            if(a[l-1]+b[n-1]+c[m-1]<=x)

            {

                if(a[l-1]+b[n-1]+c[m-1]==x)kai=1;

                goto RE;

            }

            for(j=0; j<l; j++)

            {

                //if(a[j]>=x)break;

                for(k=0; k<n; k++)

                {

                    /*if(a[j]+b[k]>=x)

                    {

                        kai1=1;

                        break;

                    }*/

                    if(search(c,m,x-a[j]-b[k]))

                    {

                        kai=1;

                        break;

                    }

                }

                if(kai==1)break;

            }

RE:

            if(kai==1)printf("YES\n");

            else printf("NO\n");

        }

    }

    return 0;

}
View Code

正解:

 

 

你可能感兴趣的:(find)