数据结构_find_lucky_number(寻找幸运值)
数据结构_find_lucky_number(寻找幸运值)
问题描述
给出两个已按升序排列的数组 a[1..n],b[1..m],如果存在 i,j,使得
a[i]+b[j]==k,我们便说已找到幸运值。请你判断能不能找到幸运值。
★数据输入
输入第一行为正整数 n, m, k。 (1<=k<=10^9)
第二行为 n 个正整数 a[1..n]。 (1<=ai<=10^9)
第三行为 m 个正整数 b[1..m]。 (1<=bi<=10^9)
80%的数据 1<=n,m<=1000.
100%的数据 1<=n,m<=100000.
★数据输出
如果能找到幸运值,输出 yes。否则输出 no。
输入示例 | 输出示例 |
3 3 8 1 2 3 4 6 7 |
yes |
输入示例 | 输出示例 |
3 3 4 1 2 3 4 6 7 |
no |
解题思路
二分查找 找指定值
code
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int pm[100002]={0}; 5 int pn[100002]={0}; 6 7 bool BinarySearch(int *p, int l, int r, int num) 8 { 9 bool flag = false; 10 while(l<=r) 11 { 12 int m = (l+r)/2; 13 if(p[m]==num) 14 { 15 flag = true; 16 break; 17 } 18 else if(p[m]<num) 19 l = m+1; 20 else 21 r = m-1; 22 } 23 return flag; 24 } 25 26 int main() 27 { 28 int n,m,k,i; 29 scanf("%d %d %d",&n,&m,&k); 30 // int *pn = (int *)malloc(sizeof(int)*n); 31 // int *pm = (int *)malloc(sizeof(int)*m); 32 for(i=0;i<n;i++) 33 scanf("%d",pn+i); 34 for(i=0;i<m;i++) 35 scanf("%d",pm+i); 36 37 bool flag = false; 38 for(i=0;i<n;i++) 39 { 40 if(BinarySearch(pm,0,m-1,k-pn[i])) 41 { 42 flag = true; 43 break; 44 } 45 } 46 47 if(flag) 48 printf("yes\n"); 49 else 50 printf("no\n"); 51 52 53 // free(pn); 54 // free(pm); 55 return 0; 56 }