2 条题解
-
0
不用二分,只需要用一个数组 表示 是否在第 组数据中出现过,然后再输入第二组数据时判断每个数是否在第 组数据中出现过就行了。
#include <bits/stdc++.h> using namespace std; int n,m,x; map<int,bool> t;//因为数据太大,所以把数组换成map。 vector<int> ans; int main(){ cin>>n>>m; while (n--){ cin>>x; t[x]=1;//标记x出现过 } while (m--){ cin>>x; if (t[x]){//如果出现过 ans.push_back(x);//加入答案 } } sort(ans.begin(),ans.end());//排序后输出 for (int i=0;i<ans.size();i++){ cout<<ans[i]<<" "; } return 0; }
-
0
经典分二分查找类型的题目,很多都是查找一个数,本题是查找一组数,但思路完全一致。
#include<bits/stdc++.h> using namespace std; int n; int a[100005], b[100005]; int find_x(int x) { int l=1,r=n,mid; while(l<=r) { mid= (r+l)/2; if(x==a[mid]) return mid; else if(x<a[mid]) r=mid-1; else l=mid+1; } return -1; } int main() { int i,m; cin>>n>>m; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=m;i++) cin>>b[i]; sort(a+1,a+n+1); sort(b+1,b+m+1); for(i=1;i<=m;i++) //查找m个数 { if(find_x(b[i])!=-1) { cout<<b[i]<<" "; } } }
- 1
信息
- ID
- 894
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 133
- 已通过
- 50
- 上传者