二分查值法

目录

 

一.什么是二分查值法?

二.二分查值法用来干嘛?

三.二分查值实现思路

1. 最大化最小值:

2. 最小化最大值:

四.模版代码

1.最大化最小值

2.最小化最大值

五.例题

1.hiho216 Gas Station

参考我关于这道题的解题博客: hiho216 Gas Station


一.什么是二分查值法?

    首先这是一种算法,算法核心思维就是利用二分法在一段区间内快速找到符合给定条件的最大值或是最小值.

二.二分查值法用来干嘛?

    用于高效解决这么两种问题:

   1. 最大化最小值:求解一个满足条件的答案x,x值域为有限的[l,r],当x很小的时候都是符合条件的,我们需要求满足条件的最大的x.

   1. 最小化最大值:求解一个满足条件的答案x,x值域为有限的[l,r],当x很大的时候都是符合条件的,我们需要求满足条件的最小的x.

三.二分查值实现思路

1. 最大化最小值:

   (1). 我们定义两个整数l,r,赋值l一个必定小于答案最小值的数,赋值r一个必定大于答案最大值的数.

   (2).当答案区间[l,r]不够小时,不断执行步骤(3)

   (3).每次循环取mid=(l+r)/2;判断答案为mid时是否符合条件,符合则令l=mid,否则r=mid,这样答案区间[l,r]一定会以logn的速度快速缩小.

   (4).循环结束后的l即为答案

2. 最小化最大值:

   (1). 我们定义两个整数l,r,赋值l一个必定小于答案最小值的数,赋值r一个必定大于答案最大值的数.

   (2).当答案区间[l,r]不够小时,不断执行步骤(3)

   (3).每次循环取mid=(l+r)/2;判断答案为mid时是否符合条件,符合则令r=mid,否则l=mid,这样答案区间[l,r]一定会以logn的速度快速缩小.

   (4).循环结束后的r即为答案

四.模版代码

1.最大化最小值

bool c(double mid){
    //判断答案为mid时是否满足条件,满足返回true,否则false
}

void solve(){
	double l=0,r=maxa,mid;
	while(r-l>0.001){
		mid=(l+r)/2;
		if(c(mid)) l=mid; 
		else r=mid;
	}
	printf("%.1lf",l);
}

2.最小化最大值

bool c(double mid){
    //判断答案为mid时是否满足条件,满足返回true,否则false
}

void solve(){
	double l=0,r=maxa,mid;
	while(r-l>0.001){
		mid=(l+r)/2;
		if(c(mid)) r=mid; 
		else l=mid;
	}
	printf("%.1lf",r);
}

五.例题

1.hiho216 Gas Station

参考我关于这道题的解题博客: hiho216 Gas Station

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值