【HDU 2141】【二分】 Can you find it?

#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std;
/*早就做过一次了,印象深刻,二分加两个数组压缩防止超时*/
int BinarySearch(int ans[],int ansnum,int d);
int main(int argc, char const *argv[])
{
	int L[505],M[505],N[505],ans[505*505];
	int l,n,m,x,xnum,ansnum,num=1;
    while(~scanf("%d %d %d",&l,&m,&n))
    {
    	ansnum=0;
    	for(int i=0;i<l;i++)
            scanf("%d",&L[i]);
        for(int i=0;i<m;i++)
            scanf("%d",&M[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&N[i]);
        for(int i=0;i<l;i++)
			for(int j=0;j<m;j++)
				ans[ansnum++]=L[i]+M[j];
		sort(ans,ans+ansnum);
		scanf("%d",&xnum);
		printf("Case %d:\n",num++);
        for(int i=0;i<xnum;i++)
        {
        	int flag=0;
            scanf("%d",&x);
            for(int j=0;j<m;j++)
            {
                int d=x-N[j];
                if(BinarySearch(ans,ansnum,d))
                {
                    flag=1;
                }
            }
            if(flag)
            	printf("YES\n");
            else
            	printf("NO\n");
        }
    }
    return 0;
}
int BinarySearch(int ans[],int ansnum,int d)
{
    int left,right,mid;
    left=0;
    right=ansnum-1;
    mid=(left+right)/2;
    while(left<=right)
    {
        mid=(left+right)/2;
        if(ans[mid]==d)
          return 1;
        else if(ans[mid]>d)
          right=mid-1;
        else if(ans[mid]<d)
          left=mid+1;
    }
    return 0;
}
为了防止超时,就用一个数组保存 ai+kj的值,然后二分就可以。

你可能感兴趣的:(c,数学)