HDU 2141 Can you find it?

数组合并
简单二分。。
为何合并呢?因为菜菜的我不知道a,b,c谁具有主导权。。
所以合并其中两个(这里我选择了a和b),另外一个枚举一下。。
为何不合并三个呢。。因为数组a and b and c 会超过限制。。

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[510];
int b[510];
int c[510];
int aandb[510*510];
int main()
{
    int l,n,m;
    int cin=0;
    while(scanf("%d%d%d",&l,&n,&m)!=EOF)
    {
        int i,j;
        int x;
        int k;
        int cin1=0;
        for(i=1;i<=l;i++)
            scanf("%d",&a[i]);
        for(i=1;i<=n;i++)
            scanf("%d",&b[i]);
        for(i=1;i<=m;i++)
            scanf("%d",&c[i]);
        printf("Case %d:\n",++cin);
        scanf("%d",&k);
        for(i=1;i<=l;i++)
            for(j=1;j<=n;j++)
                {
                    aandb[++cin1]=a[i]+b[j];//合并a和b//
                }
        sort(aandb+1,aandb+1+cin1);
        sort(c+1,c+m+1);
        for(i=1;i<=k;i++)
        {
            int flag=1;
            scanf("%d",&x);
            for(j=1;j<=m;j++)
            {
                int left=1;
                int right=cin1;
                int mid;
                while(left<=right)
                {
                    mid=(left+right)/2;
                    if(aandb[mid]+c[j]>x)
                        right=mid-1;
                    else if(aandb[mid]+c[j]<x)
                        left=mid+1;
                    else
                    {
                        flag=0;
                        printf("YES\n");
                        break;
                    }
                }
                if(flag==0)
                    break;
            }
            if(flag==1)
                printf("NO\n");
        }
    }
    return 0;
}

下面是合并a,b和合并a,b,c的比较;
这里写图片描述

你可能感兴趣的:(hdu-二分-合并)