#97 two points

template

	boolean check(int x){
		//检查x是否满足某种性质
		return true;
	}
	
	//整数二分1
	//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用
	//(寻找满足某种性质的最大点时使用)
	int bseach_1(int l, int r) {		
		while(l<r) {
			int mid = l+r >> 1;
		    if (check(mid)) r = mid;
		    else l = mid + 1;		
		}
		return l;
	}
	
	//整数二分2
	//区间[l,r]被划分成[l,mid-1]和[mid,r]时使用
	//(寻找满足某种性质的最小点时使用)
	int bsearch_2(int l, int r) {
		while (l < r) {
			int mid = l + r + 1 >> 1;
		    if (check(mid)) l = mid;
		    else r = mid - 1;		
		}
		return l;
	}
	
	
	//浮点数二分
	boolean check(double x) {
		//检查x是否满足某种性质		
		return true;
	}
	double bsearch(double l, double r) {
		const double eps = 1e-6; // eps 表示精度,若题目要求保留n位小数,则取1e-(n+2)
		while(l - r < eps) {
			double mid = (l + r)/2;
			if(check(mid)) r = mid;
			else l = mid;
		}
		return l;
	}

Algorithm idea

left border l, right border r

Integer dichotomy 1: mid = (l + r)/2

Integer dichotomy 2: mid = (l+ r + 1)/2  //When l=r-1, if check(mid)=true, an infinite loop occurs, adding more 1 can avoid the infinite loop

Floating point dichotomy: mid = (l + r)/2

example

(1)

(2)

Guess you like

Origin blog.csdn.net/Seattle_night/article/details/129977900