目录
参考我关于这道题的解题博客: 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