• 杭电 2141 Can you find it? (二分法)


    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

    定义三个数组分别存a,b,c的值,再定义数组d存a和b所有可能的和,用给定的数减去c数组中的数得到k,用二分法在d数组找k值,若能找到输出yes,否则输出no。

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 int a[505],b[505],c[505],d[505*505];
     5 int main()
     6 {
     7     int j,l,p,m,n,i,k,t,s,num,r,le,mid,key;
     8     num=0;
     9     while(scanf("%d %d %d",&l,&m,&n)!=EOF)
    10     {
    11         for(i = 0 ; i < l ; i++)
    12         {
    13             scanf("%d",&a[i]);
    14         }
    15         for(i = 0 ; i < m ; i++)
    16         {
    17             scanf("%d",&b[i]);
    18         }
    19         for(i = 0 ; i < n ; i++)
    20         {
    21             scanf("%d",&c[i]);
    22         }    
    23         p=0;
    24         for(i = 0 ; i < l ; i++)
    25         {
    26             for(j = 0 ; j < m ; j++)
    27             {
    28                 d[p++]=a[i]+b[j];
    29             }
    30         }
    31         sort(c,c+n);
    32         sort(d,d+p);
    33         scanf("%d",&t);
    34         printf("Case %d:
    ",++num);
    35         while(t--)
    36         {
    37             scanf("%d",&s);
    38             key=0;
    39             for(i = 0 ; i < n ; i++)
    40             {
    41                 k=s-c[i];
    42                 le=0;
    43                 r=p-1;                                                      
    44                 while(le <= r)
    45                 {
    46                     mid=(le+r)/2;
    47                     if(k == d[mid])
    48                     {
    49                         key=-1;
    50                         break;
    51                     }
    52                     if(k > d[mid])
    53                     {
    54                         le=mid+1;
    55                     }
    56                     else
    57                     {
    58                         r=mid-1;
    59                     }
    60                   }
    61                  if(key == -1) break;
    62             }
    63             if(key == -1) printf("YES
    ");
    64             else
    65                 printf("NO
    ");
    66         }
    67     }
    68 } 
    ——将来的你会感谢现在努力的自己。
  • 相关阅读:
    Spring AOP 详解
    java 线程的几种状态
    Atomic
    ConcurrentHashMap原理分析
    MySQL存储过程详解 mysql 存储过程
    spring-定时器(2)
    spring-定时器(1)
    spring-线程池(3)
    spring-线程池(2)
    spring-线程池(1)
  • 原文地址:https://www.cnblogs.com/yexiaozi/p/5707742.html
Copyright © 2020-2023  润新知