Can you find it?

http://acm.hdu.edu.cn/showproblem.php?pid=2141

View Code
 1 #include<iostream>
 2 #include<cstdlib>
 3 using namespace std ;
 4 #define maxn 505
 5 int a[maxn], b[maxn], c[maxn] ;
 6 int ab[maxn*maxn] ;
 7 int cmp(const void *a, const void *b)
 8 {
 9     return *(int *)a - *(int *)b ;
10 }
11 int find(int n, int len)
12 {
13    int min, max, mid ;
14    min = 0 ;
15    max = len -1 ;
16    while(min<=max)
17    {
18        mid = (min+max)/2 ;
19        if(ab[mid]==n)
20        return 1 ;
21        if(ab[mid]<n)
22        min = mid + 1  ;
23        if(ab[mid] >n)
24        max = mid - 1 ;
25    }
26     return 0 ;
27 }
28 int main()
29 {
30     int i, j, k , x, s ;
31     int l, n, m ;
32     int times = 1 ;
33     while(cin>>l>>n>>m)
34     {
35         int num = 0 ;
36         for(i=0; i<l; i++)
37         cin>>a[i] ;
38         for(j=0; j<n; j++)
39         cin>>b[j] ;
40         for(k=0; k<m; k++)
41         cin>>c[k] ;
42         for(i=0; i<l; i++)
43         for(j=0; j<n; j++)
44         {
45             ab[num++] = a[i] + b[j] ;
46         }
47         qsort(ab, num, sizeof(ab[0]), cmp) ;
48         cout<<"Case "<<times++<<":"<<endl ;
49         cin>>s ;
50         while(s--)
51         {
52             cin>>x ;
53             int flag = 1 ;
54             for(k=0; k<m; k++)
55             {
56                 if(find(x-c[k],num)==1)
57                 {
58                     flag = 0 ;
59                     break ;
60                 }
61             }
62             if(flag==0)
63             cout<<"YES"<<endl ;
64             else
65             cout<<"NO"<<endl ;
66         }
67     }
68     return 0 ;
69 }

 输入有三个集合,要先合并两个为一,然后再对这个
合并出来的集合进行二分

posted @ 2013-02-26 21:06  yelan@yelan  阅读(210)  评论(0编辑  收藏  举报