蒜头君所在的学校又迎来了一年一度的开花活动,有 nn 名学生被评为文学优秀奖,mm 名学生被评为体育优秀奖。现已知两个奖项获奖同学的编号,每个同学都有唯一的编号。只有同时被评为文学优秀奖和体育优秀奖的学生才能开花,蒜头君想知道开花的名单,请你帮他统计一下。
输入格式
第一行两个整数 n,m(1≤n,m≤10^5),分别表示文学优秀奖和体育优秀奖的获奖人数。
第二行 nn 个不同的整数,表示获得文学优秀奖的同学编号。
第二行 mm 个不同的整数,表示获得体育优秀奖的同学编号。
所有编号为正整数且不超过 10^9。
输出格式
一行若干个空格分隔的整数,表示开花的同学编号,按文学优秀奖的先后次序输出。
Sample Input
4 4 5 1 7 3 2 3 4 1
Sample Output
1 3 若暴力解决该题肯定会超时,所以要用二分法; 思路:把两个奖获奖编号分别存到a,b数组中,因为二分法只能用于一个有序数列,所以给数组b排序,用到sort函数,再遍历一编a数组,依次在b数组中查找。 题目链接nuc-acm第三周练习题L
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
const int N=1e5+7;
int a[N],b[N];
int n,m;
void solve(int k)
{
int l=0;
int r=m;//m必须定义在主函数之前才能在solve中调用
while(l<=r)
{
int mid=(l+r)/2;
if(b[mid]==k){
cout<<k<<" ";
break;
}
else if(b[mid]<k) l=mid+1;
else if(b[mid]>k) r=mid-1;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<m;i++)scanf("%d",&b[i]);
sort(b,b+m);//把b数组从大到小排序;
for(int i=0;i<n;i++)
{
solve(a[i]);
}
return 0;
}