二分思想

众所周知,二分是一种简单实用的搜索方法,用于搜索一个有序数列中大于(等于)或小于(等于)某个值的第一个元素的位置。
思路就是每一次都找出左边界l和有边界r的中点mid,然后根据题目的要求判断条件,把mid更新为l或r,一直这样直到l >= r时,返回r或l。
然后。。。直接看看模板吧,嘿嘿。

1.整形二分

整形二分比较诡异。。。主要是设计到边界问题,容易出现问题。
不过我们可以概括分为两种情况,然后用上相应的模板,就不会出现边界问题啦啦啦~~

<1>判断条件成立时让r = mid的情况

const int N = 10010;
int a[N];

int bserch(int x, int l, int r)
{
	while(l < r)
	{
		int mid = r + l >> 1;
		if(a[mid] >= x) r = mid;
		else l = mid;
	}
	return l;
}

<2>判断条件成立时让l = mid的情况

const int N = 10010;
int a[N];

int bserch(int x, int l, int r)
{
	while(l < r)
	{
		int mid = r + l + 1 >> 1;
		if(a[mid] <= x) l = mid;
		else r = mid;
	}
	return r;
}

其实也很容易看出来,两个板子基本只有mid = l + r >> 1和mid = l + r + 1 >> 1的区别,所以很容易就可以记住了。

2.实型二分

实型二分就简单很多了,少了奇奇怪怪的边界问题,直接用思想转换成板子就好了。

const int N = 10010;

double bserch(double x, double l, double r)
{
	while(l < r)
	{
		double mid = (r + l) / 2;
		if(mid >= x) r = mid;
		else l = mid;
	}
	return l;
}

然后。。。。完了。。没有了。。。就是这样。。。感觉好短呀QwQ
算了算了,不管了,睡了zzz

你可能感兴趣的:(二分思想)