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
", ans);
48     }
49 return 0;
50 }
原文地址:https://www.cnblogs.com/oscar-cnblogs/p/6561845.html