HDU 3763 CDs
http://acm.hdu.edu.cn/showproblem.php?pid=3763
题意:
两组数据
看重复的有多少
如果每输入一个就去查找的话O(n^2) 会超时
所以可以用二法
第一组数据输入
然后第二组数据输入 在第一组数据用二分查 这样O(n*logn)
不能用set等容器 虽然时间复杂度是一样的但是 MLE
还有一种O(n)的做法
枚举a数组中的元素,然后用一个指针指向b数组中第一个大于等于a数组当前元素的数,不断移动这个指针即可
1 #include <iostream> 2 #include <stdio.h> 3 4 using namespace std; 5 6 7 int a[1000007]; 8 int b[1000007]; 9 int n; 10 bool search(int x) 11 { 12 int l = 0, r = n-1; 13 int mid = (l+r)/2; 14 while(l <= r) 15 { 16 if (a[mid] < x){ 17 l = mid+1; 18 mid = (l+r) / 2; 19 } 20 else if (a[mid] > x) 21 { 22 r = mid-1; 23 mid = (l+r)/2; 24 } 25 else return true; 26 } 27 return false; 28 29 } 30 int main() 31 { 32 freopen("in.txt", "r", stdin); 33 int m, ans = 0; 34 while(~scanf("%d%d", &n, &m)) 35 { 36 ans = 0; 37 if ( m== 0 && n == 0) break; 38 for (int i = 0; i < n; i++) 39 scanf("%d", &a[i]); 40 int tmp; 41 for (int i = 0; i < m; i++) 42 { 43 scanf("%d", &tmp); 44 if (search(tmp)) 45 ans++; 46 } 47 printf("%d\n", ans); 48 } 49 return 0; 50 }