[关闭]
@Metralix 2017-03-31T14:40:36.000000Z 字数 819 阅读 688

B - Can you find it?

二分


题目大意

分别有a,b,c三个数组,给出一个数,看这个数能不能再a,b,c,里面分别找出一个数求和得到

解题思路

输入有三个集合,要先合并两个为一,然后再对这个
合并出来的集合进行二分;
  1. #include <stdio.h>
  2. #include <algorithm>
  3. using namespace std;
  4. int Binary_search(int ab[],int n,int x)
  5. {
  6. int f,c,m;
  7. f=0;
  8. c=n-1;
  9. m=(c+f)/2;
  10. while(c>=f)
  11. {
  12. m=(c+f)/2;
  13. if(ab[m]==x) return 1;
  14. else if(ab[m]>x) c=m-1;
  15. else f=m+1;
  16. }
  17. return 0;
  18. }
  19. int a[505];
  20. int b[505];
  21. int c[505];
  22. int ab[505*505];
  23. int main()
  24. {
  25. int L,N,M;
  26. int ti=1;
  27. while(scanf("%d %d %d",&L,&N,&M)!=EOF)
  28. {
  29. int i,j,k,n=0;
  30. for(i=0;i<L;i++) scanf("%d",&a[i]);
  31. for(i=0;i<N;i++) scanf("%d",&b[i]);
  32. for(i=0;i<M;i++) scanf("%d",&c[i]);
  33. for(i=0;i<L;i++)
  34. {
  35. for(j=0;j<N;j++)
  36. {
  37. ab[n++]=a[i]+b[j];
  38. }
  39. }
  40. sort(ab,ab+n);
  41. //for(i=0;i<n;i++) printf("%d",ab[i]);
  42. scanf("%d",&k);
  43. printf("Case %d:\n",ti++);
  44. while(k--)
  45. {
  46. int x,p=1;
  47. scanf("%d",&x);
  48. for(j=0;j<M;j++)
  49. {
  50. if(Binary_search(ab,n,x-c[j]))
  51. {
  52. printf("YES\n");
  53. p=0;
  54. break;
  55. }
  56. }
  57. if(p) printf("NO\n");
  58. }
  59. }
  60. return 0;
  61. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注