hdoj2141 Can you find it?

Can you find it?

Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/10000 K (Java/Others)

Total Submission(s): 17531    Accepted Submission(s): 4432

Problem Description

Give you three sequences of numbers A, B, C, then we give you a number X. Now you need to calculate if you can find the three numbers Ai, Bj, Ck, which satisfy the formula Ai+Bj+Ck = X.

Input

There are many cases. Every data case is described as followed: In the first line there are three integers L, N, M, in the second line there are L integers represent the sequence A, in the third line there are N integers represent
the sequences B, in the forth line there are M integers represent the sequence C. In the fifth line there is an integer S represents there are S integers X to be calculated. 1<=L, N, M<=500, 1<=S<=1000. all the integers are 32-integers.

Output

For each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".

Sample Input

3 3 3
1 2 3
1 2 3
1 2 3
3
1
4
10

Sample Output

Case 1:
NO
YES
NO

Author

wangye

Source

HDU 2007-11 Programming Contest

原题目:hdoj2141

个人思路:

三组数据,先把前两组相加并排序,然后拿所取出的值减去第三组的值,并与前两组的和进行比较即可!具体代码分析:

我写了两种,stl和二分:

s t l:

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[250050],b[250050],c[250050],d[250050];
int main()
{
	int A,B,C,i,j;
	 int w=1;
	while(scanf("%d%d%d",&A,&B,&C)!=EOF)
	{
		int l=0;
		for(i=0;i<A;i++)
		 scanf("%d",&a[i]);
		for(i=0;i<B;i++)
		 scanf("%d",&b[i]);
		for(i=0;i<C;i++)
		 scanf("%d",&c[i]);
		   for(i=0;i<A;i++)
		     for(j=0;j<B;j++)
		       d[l++]=a[i]+b[j];
		    sort(d,d+l);//前两组相加并排序
		    sort(c,c+C);
		 int n,m;
		 printf("Case %d:\n",w++);
		 scanf("%d",&n);
		 while(n--)
		 	int y,t;
		 	int temp=0;
		 	scanf("%d",&m);
		 	for(i=0;i<C;i++)
		 	 {
		 	 	y=m-c[i];
		 	 	t=lower_bound(d,d+l,y)-d;//stl中找到大于或等于y的地址值,再减去首地址即得到数组所在下标
		 	 	if(y==d[t])// /看该下标的值是否与y相等
		 	 	{
		 	 		temp=1;
		 	 		break;
				}
			  }
			  if(temp==1)
			  printf("YES\n");
			  else
			  printf("NO\n");
		 }
	}
	return 0;
}

二分查找:

#include<iostream>
#define MAX 251000
#include<algorithm>
using namespace std;
int L[MAX],N[MAX],M[MAX],a[MAX];
int main()
{
    int l,n,m,cas=1;
    while(cin>>l>>n>>m)
    {
        int i,j,t,k;
        for(i=0;i<l;++i)
            cin>>L[i];
         for(j=0;j<n;++j)
            cin>>N[j];
        for(t=0;t<m;++t)
            cin>>M[t];
        k=0;
        for(i=0;i<l;i++)
            for(j=0;j<n;++j)
                a[k++]=L[i]+N[j];
//            cout<<"            "<<k<<endl;
        sort(a,a+k);
        sort(M,M+m);

        cout<<"Case "<<cas++<<":"<<endl;
        int s,x,y,temp;
        cin>>s;
        while(s--)
        {
            temp=0;
            cin>>x;
            for(i=0;i<m;++i)
            {
                y=x-M[i];
                int left,right,mid;
                left=0;
                 right=k-1;
                if(a[k-1]<y)
                    continue;
                while(left<=right)
                {
//                    cout<<left<<"              "<<right<<endl;
                    mid=(left+right)/2;
                    if(a[mid]==y)
                    {
                        temp=1;
                        break;
                    }
                    if(a[mid]>y)
                        right=mid-1;
                    else
                        left=mid+1;
                }

            }
            if(temp)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 00:33:01

hdoj2141 Can you find it?的相关文章

HDOJ2141(map在二分查找中的应用)

#include<iostream> #include<cstdio> #include<map> #include<algorithm> using namespace std ; #define M 500 + 10 int a[M] ; int b[M] ; int c[M] ; int d[M] ; int l ; int n ; int m ; map <int , bool > Map ; void Marge() { for(int

HDOJ2141(map在二分搜索中的应用)

#include<iostream> #include<cstdio> #include<map> #include<algorithm> using namespace std ; #define M 500 + 10 int a[M] ; int b[M] ; int c[M] ; int d[M] ; int l ; int n ; int m ; map <int , bool > Map ; void Marge() { for(int