首页 > 其他 > 详细

hdu 2141 Can you find it?

时间:2015-03-23 21:16:56      阅读:205      评论:0      收藏:0      [点我收藏+]
#include <cstdio>  
#include <algorithm>  
#include <map>  
#include <vector>  
#include <cstring>  
#define maxn 550  
using namespace std;  
int a[maxn],b[maxn],c[maxn],d[maxn*maxn];  
int main()  
{  
   // freopen("input.txt","r",stdin);  
    int l,m,n;int cnt=0;  
    while(scanf("%d%d%d",&l,&n,&m)!=EOF){  
      for(int i=0;i<l;i++) scanf("%d",a+i);  
      for(int i=0;i<n;i++) scanf("%d",b+i);  
      for(int i=0;i<m;i++) scanf("%d",c+i);  
      for(int i=0;i<l;i++)  
        for(int j=0;j<n;j++)  
         d[i*l+j]=a[i]+b[j];  
      sort(d,d+l*n);  
      int T;cin>>T;  
      int s;  
      cout<<"Case "<<++cnt<<":"<<endl;  
      while(T--){  
         scanf("%d",&s);  
         bool ok=false;  
         for(int i=0;i<m;i++)  
           if(binary_search(d,d+l*n,s-c[i])) {ok=true;break;}  
         if(ok) printf("YES\n");else printf("NO\n");  
      }  
    }  
    return 0;  
}

  

#include<stdio.h>
#include<algorithm>
using namespace std;
#define K 505
int LN[K*K];
int BinarySearch(int LN[],int h,int t)/*二分查找*/
{
    int left,right,mid;
    left=0;
    right=h-1;
    mid=(left+right)/2;
    while(left<=right)
    {
        mid=(left+right)/2;
        if(LN[mid]==t)
          return 1;
        else if(LN[mid]>t)
          right=mid-1;
        else if(LN[mid]<t)
          left=mid+1;
    }
    return 0;
}
int main()
{
    int i,j,count=1,q;
    __int32 L[K],N[K],M[K],S,n,m,l;
    while(scanf("%d%d%d",&l,&n,&m)!=EOF)
    {
        int h=0;
        for(i=0;i<l;i++)
         scanf("%d",&L[i]);
        for(i=0;i<n;i++)
          scanf("%d",&N[i]);
        for(i=0;i<m;i++)
          scanf("%d",&M[i]);
        for(i=0;i<l;i++)
          for(j=0;j<n;j++)
           LN[h++]=L[i]+N[j];/*合并L和N*/
        sort(LN,LN+h); /*对LN数组排序*/
        scanf("%d",&S);
        printf("Case %d:\n",count++);
        for(i=0;i<S;i++)
        {
            scanf("%d",&q);/*q即为题目中的x*/
            int p=0; /*p为标记,0为找不到,1为能找到*/
            for(j=0;j<m;j++)
            {
                int a=q-M[j]; /*因为L[i]+N[j]+M[k]==q,所以q-M[k]=LN[h]*/
                if(BinarySearch(LN,h,a)) /*在LN数组中查找到a*/
                {
                    printf("YES\n");
                    p=1;
                    break;
                }
            }
            if(!p) /*找不到a*/
              printf("NO\n");
        }
    }
    return 0;
}

  

技术分享
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn = 505;
 6 const int mod = 600000;
 7 const int INF = (1<<30);
 8 struct node
 9 {
10     int key;
11     int count;
12 }h[mod];
13 int a[maxn];
14 int b[maxn];
15 int c[maxn];
16 
17 void add(int p)
18 {
19     int k = p%mod;
20     if (k < 0)
21         k += mod;
22     while (h[k].count != 0)
23     {
24         if (h[k].key == p)
25         {
26             h[k].count++;
27             break;
28         }
29         k = (k+1)%mod;
30     }
31     if (h[k].count == 0)
32     {
33         h[k].count++;
34         h[k].key = p;
35     }
36 }
37 bool find(int p)
38 {
39     int k = p%mod;
40      if (k < 0)
41         k += mod;
42     while (h[k].count!=0)
43     {
44         if (h[k].key == p)
45             return true;
46         k = (k+1)%mod;
47     }
48     return false;
49 }
50 int main()
51 {
52     int i, j,k;
53     int l, n, m, s;
54     int p;
55     int ca = 1;
56     while (scanf("%d %d %d",&l,&m,&n)!=EOF)
57     {
58           memset(h,0,sizeof(h));
59           for (i=0; i<l; i++)
60             scanf("%d",&a[i]);
61           for (i=0; i<m; i++)
62             scanf("%d",&b[i]);
63           for (i=0; i<n; i++)
64             scanf("%d",&c[i]);
65           sort(a,a+l);
66           sort(b,b+m);
67           sort(c,c+n);
68           for (i=0; i<l; i++)
69             for (j=0; j<m; j++)
70                 add(a[i]+b[j]);
71           bool flag=false;
72           scanf("%d",&s);
73           printf("Case %d:\n",ca++);
74           while (s--)
75           {
76              int p;
77              scanf("%d",&p);
78            /*  if (a[0]+b[0]+c[0]>p || a[l-1]+b[m-1]+c[n-1]<p)
79             {
80                 printf("NO\n");
81                 continue;
82             }*/
83              for (i=0; i<n; i++)
84                 if (find(p-c[i]))
85                     break;
86              printf("%s\n",i==n?"NO":"YES");
87           }
88     }
89     return 0;
90 }
View Code

 

hdu 2141 Can you find it?

原文:http://www.cnblogs.com/Canace/p/4360842.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!