Can you find it?(二分)

来源:互联网 发布:阿里云logo矢量图 编辑:程序博客网 时间:2024/06/02 03:15
#include<cstdio>#include<algorithm>#define N 505using namespace std;__int64 a[N],b[N],c[N],sum[N*N];__int64 la,lb,lc,len;int bin(__int64 x){__int64 l=0,r=len-1,mid;while(l<=r){mid=(l+r)/2;if(sum[mid]==x)  return 1;else if(sum[mid]>x)  r=mid-1;else l=mid+1;}return 0;}int main(){__int64 i,j,cas=0,s,x,k,m;while(~scanf("%I64d%I64d%I64d",&la,&lb,&lc)){__int64 len=0;for(i=0;i<la;i++)   scanf("%I64d",&a[i]);for(i=0;i<lb;i++)   scanf("%I64d",&b[i]);for(i=0;i<lc;i++)   scanf("%I64d",&c[i]);for(i=0;i<la;i++)   for(j=0;j<lb;j++)      sum[len++]=a[i]+b[j];          scanf("%I64d",&m); printf("Case %I64d:\n",++cas);sort(sum,sum+len);sort(c,c+lc);while(m--){__int64 pp;scanf("%I64d",&s);if(s<c[0]+sum[0]||s>c[la-1]+sum[len-1]){printf("NO\n");continue;}for(i=0;i<lc;i++){pp=s-c[i];if(bin(pp)){printf("YES\n");break;}  }if(i==lc) printf("NO\n");}  }return 0;}

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 31 2 31 2 31 2 331410
 

Sample Output
Case 1:NOYESNO

ab数组合并,改为:A+B=X-C,然后二分搜一下就可以了

  1. #include <iostream>  
  2. #include <algorithm>  
  3. using namespace std;  
  4.   
  5. const int N = 505;  
  6.   
  7. __int64 ab[N * N];  
  8. int num;  
  9.   
  10. int search(__int64 x)  
  11. {  
  12.     int f = 0, l = num - 1;  
  13.     int mid;  
  14.     while(f <= l)  
  15.     {  
  16.         mid = (f + l) / 2;  
  17.         if(ab[mid] == x)  
  18.             return 1;  
  19.         else if(ab[mid] < x)  
  20.             f = mid + 1;  
  21.         else  
  22.             l = mid - 1;  
  23.     }  
  24.     return 0;  
  25. }  
  26.   
  27. int main()  
  28. {  
  29.     int n, m, l, flag = 0, s;  
  30.     __int64 a[N], b[N], c[N], x;  
  31.     while(cin >> n >> m >> l)  
  32.     {  
  33.         flag++;  
  34.         num = 0;  
  35.         for(int i = 0; i < n; i++)  
  36.             scanf("%I64d", &a[i]);  
  37.         for(int i = 0; i < m; i++)  
  38.             scanf("%I64d", &b[i]);  
  39.         for(int i = 0; i < l; i++)  
  40.             scanf("%I64d", &c[i]);  
  41.   
  42.         for(int i = 0; i < n; i++)  
  43.             for(int j = 0; j < m; j++)  
  44.                 ab[num++] = a[i] + b[j];  
  45.         sort(ab, ab+num);  
  46.         sort(c, c+l);  
  47.         scanf("%d", &s);  
  48.         printf("Case %d:\n", flag);  
  49.         while(s--)  
  50.         {  
  51.             scanf("%I64d", &x);  
  52.             if(x < ab[0] + c[0] || x > ab[num-1] + c[l-1])  
  53.                 printf("NO\n");  
  54.             else  
  55.             {  
  56.                 __int64 p;  
  57.                 int j;  
  58.                 for(j = 0; j < l; j++)  
  59.                 {  
  60.                     p = x - c[j];  
  61.                     if(search(p))  
  62.                     {  
  63.                         printf("YES\n");  
  64.                         break;  
  65.                     }  
  66.                 }  
  67.                 if(j == l)  
  68.                     printf("NO\n");  
  69.             }  
  70.         }  
  71.     }  
  72.     return 0;  
  73. }  
错误代码,找了好长时间就是不知道哪错了,醉了
#include <stdio.h>  #include <algorithm>  #include <string.h>  using namespace std;    __int64 a[505],b[505],c[505],la,lb,lc;  __int64 sum[505*505],len;    int bin(__int64 x)  {      __int64 l = 0,r = len-1;      while(l<=r)      {          __int64 mid = (l+r)>>1;          if(sum[mid] == x)              return 1;          else if(sum[mid]>x)              r = mid-1;          else              l = mid+1;      }      return 0;  }    int main()  {      __int64 m,s,cas = 1,i,j,k;      while(~scanf("%I64d%I64d%I64d",&la,&lb,&lc))      {  
        __int64 len=0;   //出错点        for(i = 0; i<la; i++)              scanf("%I64d",&a[i]);          for(i = 0; i<lb; i++)              scanf("%I64d",&b[i]);          for(i = 0; i<lc; i++)              scanf("%I64d",&c[i]);          sort(c,c+lc);          for(i = 0; i<la; i++)          {              for(j = 0; j<lb; j++)              {                 sum[len++] = a[i]+b[j];              }          }          sort(sum,sum+len);          len = unique(sum,sum+len)-sum;          scanf("%I64d",&m);          printf("Case %I64d:\n",cas++);          while(m--)          {              scanf("%I64d",&s);              if(s>sum[len-1]+c[lc-1] || s<sum[0]+c[0])              {                  printf("NO\n");                  continue;              }              __int64 flag = 0;              for(i = 0;i<lc;i++)              {                  int kk = s-c[i];                  if(bin(kk))                  {                      flag = 1;                      break;                  }              }              if(flag)                  printf("YES\n");              else                  printf("NO\n");          }      }        return 0;  }  

0 0
原创粉丝点击