hdu 2141(二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2141

最近想做做水题找找感觉。。orz,水题也不好切啊。。。一开始没分析,直接暴力,可想而知,TLE。。。然后就用了二分。。。wa了好几次。。

View Code
 1 #include<iostream>
 2 #include<algorithm>
 3 const int MAXN=507;
 4 using namespace std;
 5 __int64  a[MAXN],b[MAXN],c[MAXN],d[MAXN*MAXN];
 6 
 7 int Binary_Search(__int64 number,int low,int high){
 8     while(low<=high){
 9         int mid=(low+high)/2;
10         if(d[mid]==number)return 1;
11         else if(d[mid]>number)high=mid-1;
12         else low=mid+1;
13     }
14     return 0;
15 }
16 
17 
18 int main(){
19     int L,N,M;
20     int _case=1;
21     while(~scanf("%d%d%d",&L,&N,&M)){
22         for(int i=0;i<L;i++)scanf("%I64d",&a[i]);
23         for(int i=0;i<N;i++)scanf("%I64d",&b[i]);
24         for(int i=0;i<M;i++)scanf("%I64d",&c[i]);
25         int l=0;
26         for(int i=0;i<L;i++){
27             for(int j=0;j<N;j++){
28                 d[l++]=a[i]+b[j];
29             }
30         }
31         sort(c,c+M);
32         sort(d,d+l);
33         int s;
34         scanf("%d",&s);
35         printf("Case %d:\n",_case++);
36         while(s--){
37             __int64 x;
38             scanf("%I64d",&x);
39             if(x<c[0]+d[0]||x>c[M-1]+d[l-1]){
40                 printf("NO\n");
41                 continue;
42             }
43             int flag=0;
44             for(int i=0;i<M;i++){
45                 __int64 tmp=x-c[i];
46                 if(Binary_Search(tmp,0,l-1)){
47                     flag=1;
48                     break;
49                 }
50             }
51             if(flag){
52                 printf("YES\n");
53             }else 
54                 printf("NO\n");
55         }
56     }
57     return 0;
58 }
59 
60 
61             
62         

 

posted @ 2013-03-19 16:39  ihge2k  阅读(231)  评论(0编辑  收藏  举报