二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组中。这个函数定义在<algorithm> 头文件中,用来查找某个区域内是否包含某个元素。
对二分不熟悉的可以先看看我的这篇讲二分的文章:
C++二分解释【初学者放心进,简单易懂】
(就简单描述一下,毕竟我也是一个编程小白)
那binary_search函数应该怎么用呢?
先来看一道题,这道题其实就是binary_search的一个简单应用(看完应该就明白了)
题目描述是这样的
由n个正整数构成的一个正整数序列,有q次循环,每次询问输入一个x,
判断x是否存在在序列中
,如果存在,输出yes,不存在输出no
#include<bits/stdc++.h>
using namespace std;
long long n,q,a[100001],x;
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
for(int i=1;i<=q;i++){
cin>>x;
if(binary_search(a+1,a+1+n,x)==1) cout<<"yes\n";
else cout<<"no\n";
}
return 0;
}
用binary_search函数
判断给定序列中是否存在x
首先,binary_search的方法为二分查找,所以数组必须是有序的或者是用sort()方法排序之后的。binary_search的格式也和sort非常相似
binary_search(a,a+n,x);
a是数组名,在a数组中查找是否存在x,
如果存在就返回1,不存在就返回0
(我觉得应该讲得差不多了吧)
那,最后的最后,我再给大家看一道
水题
应用题
描述
小花所在的学校又迎来了一年一度的奖励小红花活动,有n名学生被评为文学优秀奖,m名学生被评为体育优秀奖。现已知两个奖项获奖同学的编号,每个同学都有唯一的编号。只有同时被评为文学优秀奖和体育优秀奖的学生才能获得小红花,小花想知道获得小红花的学生的名单,请你帮她统计一下。
输入
第一行两个整数n,m(1≤n,m≤10^5105),分别表示文学优秀奖和体育优秀奖的获奖人数,两数之间以一个空格分隔。
第二行n个不同的整数,表示获得文学优秀奖的同学编号,相邻两数之间以一个空格分隔。
第三行m个不同的整数,表示获得体育优秀奖的同学编号,相邻两数之间以一个空格分隔。
所有编号为正整数且不超过10^6106。
输出
一行若干个空格分隔的整数,表示获得小红花的同学编号,按文学优秀奖的先后次序输出。
输入样例
4 4 5 1 7 3 2 3 4 1
输出样例
1 3
大家可以先自己尝试一下
(真的简单!!!)
答案先放在这,但还是要尽量自己尝试啊
#include<bits/stdc++.h>
using namespace std;
long long w[100001],t[100001],n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>w[i];
}
for(int i=1;i<=m;i++){
cin>>t[i];
}
sort(t+1,t+1+m);
for(int i=1;i<=n;i++){
if(binary_search(t+1,t+1+m,w[i])==1){
cout<<w[i]<<" ";
}
}
return 0;
}
好啦,就这样吧,下次再见啦
(博主写文章不易,确定不给个赞再走?)