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         

 

你可能感兴趣的:(HDU)