stl二分函数

菜鸟笔记1
第一次使用stl中的函数。
很不幸题目没法复制粘贴,简述题目如下:
输入n个整数,进行m次查找(就是查找程序运行m遍)每次查找找一个数。
题目如下:
输入样例:
第一行 2 个整数 n 和 m,表示数字个数和询问次数。
第二行 n 个整数,表示这些待查询的数字。
第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。
eg:输入
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
输出
1 2 -1

#include<cstdio>//及时复习,有关stl的问题
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
	long long a[1000010];
	long long t;
	long int n,m;
	scanf("%ld%ld",&n,&m);
	for(int i=0;i<n;i++)
		scanf("%lld",&a[i]);
	for(int j=0;j<m;j++)
	{
		scanf("%lld",&t);
		int answer=lower_bound(a,a+n,t)-a;
		if(a[answer]!=t)
			printf("-1 ");
		else
			printf("%d ",++answer);//注意输出的是第几个数,而不是再数组中的位位置
	}
	return 0;
}

简述思想就是利用stl中的函数,可以轻易的查找到那个值,括号中第一个是首地址,逗号,尾地址,逗号,要查找的数据,
返回的是是一个地址,所以注意减a。
这两个函数的作用是二分查找一个数在数组中出现的位置。区别是 upper 返回第一个大于搜索数的位置,而 lower 是第一个大于等于的数的位置。显然这道题用的是 lower。
如果找不到,那么返回last的地址。
附带私货cmp

bool cmp(int a, int b)
{
	return a > b;
}

专用于反向
return code;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值