二分入门——STL中的二分函数 计蒜客信息学题库 1873 开花

计蒜客信息学题库 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;
}


第一次写博客,有说的不当的地方请各位大佬在评论区及时指正和补充,感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值