• hdu 2141 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): 9266    Accepted Submission(s): 2418


    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
     
    Recommend
    威士忌   |   We have carefully selected several similar problems for you:  2899 2289 1551 2298 1399 
     
     1 /*
     2 题意:Ai+Bj+Ck = X;
     3            其中Ai 属于数组a[ ] , Bj 属于数组b[ ], Ck属于数组 C[ ] 的元素。
     4            求是否能找到满足X。而且X个数有1000,A,B,C个数为500.
     5            思路1.  枚举 X-Ck ,Bj,用二分找Ai是否存在。
     6                         时间复杂度 f(    1000*500*500*log(500)       )
     7            思路2.  Ai+Bj,看成一项。用数组保存tom[ 500*500+1];
     8                         枚举 X-Ck,用二分找tom[ ];
     9                         时间复杂度 f(     1000*500*log(500*500)        )
    10 
    11 */
    12 
    13 #include<iostream>
    14 #include<stdio.h>
    15 #include<cstring>
    16 #include<cstdlib>
    17 #include<algorithm>
    18 using namespace std;
    19 
    20 int l[502],n[502],m[502];
    21 int a[250003];
    22 
    23 int EF(int l,int r,int x)
    24 {
    25     int mid;
    26     while(l<=r)  //  is  not  while(l<r)  !!
    27     {
    28         mid=(l+r)/2;
    29         if( a[mid]>x)
    30             r=mid-1;
    31         else if( a[mid]<x)
    32             l=mid+1;
    33         else return 1;
    34     }
    35     return -1;
    36 }
    37 int main()
    38 {
    39     int i,j;
    40     int L,N,M,S,num=0,x,k,len,t;
    41     while(scanf("%d%d%d",&L,&N,&M)>0)
    42     {
    43         for(i=1;i<=L;i++)
    44             scanf("%d",&l[i]);
    45         for(i=1;i<=N;i++)
    46             scanf("%d",&n[i]);
    47         for(i=1;i<=M;i++)
    48             scanf("%d",&m[i]);
    49         len=L*N;t=0;
    50         for(i=1;i<=L;i++)
    51         for(j=1;j<=N;j++)
    52         {
    53             a[++t]=l[i]+n[j];
    54         }
    55         sort(a+1,a+1+len);
    56         scanf("%d",&S);
    57         printf("Case %d:
    ",++num);
    58         while(S--)
    59         {
    60             scanf("%d",&x);
    61             for(i=1;i<=M;i++)
    62             {
    63                 k=EF(1,len,x-m[i]);
    64                  if( k==1 ) break;
    65             }
    66             if( k==-1) printf("NO
    ");
    67             else printf("YES
    ");
    68         }
    69     }
    70     return 0;
    71 }
     
  • 相关阅读:
    Leetcode第七题——数的反转
    Leetcode第六题——横向遍历ZIGZAG数组
    26 将查询结果插入到一张表中?
    25 表的复制
    24 insert 语句插入数据
    23 创建表
    22 limit(重点中的重点,以后分页查询全靠它了。)
    21 union(可以将查询结果集相加
    20 子查询
    19 连接查询
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3561623.html
Copyright © 2020-2023  润新知