二分

二分的话,你真不懂也没必要一定搞懂(初赛,高中信息技术考试可能需要),真正打代码不需要搞懂二分。。

只要知道它是在有序数列里花log n 的时间找一个值就行了,

本质就是查找的优化

 

关于输出什么可能会不会,但基本知道这些就好了:

下面是找数字的二分模板(数据很小,随便写的)

#include <bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
	int n,x;
	cin>>n>>x;
	for(int i=1;i<=n;i++)
	    cin>>a[i];
	int l=0,r=n;
	while(l<r)//这里l<r 最后的结果就是l=r退出循环,如果是l<=r,最后就是l=r+1
	{
		int mid=(l+r)>>1;
		if(a[mid]<x) l=mid+1;
		else r=mid-1;
	}
	cout<<r;
	return 0;
}

  

假如数据不存在 如

5   3

1   2   4   5   6

只要稍微想想就好了:(按while(l<r)来)while终止之前肯定是l=2,r=3; 代入循环:a[(2+3)/2]=a[2]<3 所以 l=mid+1=3=r 退出循环

这样就好了,你不需要从开头一个个推。。。

posted @ 2021-06-07 14:16  小霜降  阅读(47)  评论(0编辑  收藏  举报