计蒜客信息学题库 1873 开花
最近准备蓝桥杯一直在刷题,在大佬推荐下开始写博客写题解
现在才发现每次用笔记真是有点low了…
先来看下题
思路:第一思路是用map,如果某个数的出现两次就能开花,但是最近在学二分,map就没试过了。想到了STL中的两个函数upper_bound()和lower_bound(),不过要特别注意使用这两个函数的前提:数组必须是有序。我一开始是对a数组进行排序的,后来经过大佬指点发现题目中的输出要按照文学优秀奖的先后次序输出,又试了对b数组排序,最后才AC了(以后一定要好好读题,不然该劝退了)
注意点:upper_bound()返回的是第一个大于所查找值的地址,减去首地址才是这个值的下标,lower_bound()返回
的是第一个大于等于所查找值的地址,同样减去首地址才是下标。
直接上AC代码了:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
int n,m;
ll a[N];
ll b[N];
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<m;i++)
{
cin>>b[i];
}
//sort(a,a+n);
sort(b,b+m);
for(int i=0;i<n;i++)
{
int x=lower_bound(b,b+m,a[i])-b;
int y=upper_bound(b,b+m,a[i])-b;
if(b[x]==a[i])//这个判断我尝试了好久,也没太搞清楚
{
cout<<b[x]<<" ";
}
}
return 0;
}
第一次写博客,有说的不当的地方请各位大佬在评论区及时指正和补充,感谢!