通常の二分テンプレート
int l,r,res;
//l, r初始化,问题答案的左边界和右边界确定
while(l<=r){
int mid=(l+r)/2;
if (ok(mid)){
res=mid;
r= mid-1;
}
else
l=mid+1;
}
浮動小数点バイナリテンプレート
const double eps = 1e-7;
double l, r;
// l,r初始化,问题答案的左边界和右边界的确定
while (l + eps < r){
double mid = (l + r) / 2.0;
if (ok (mid)){
l = mid;
// r = mid;
}
else {
r = mid;
// l = mid;
}
}
3点テンプレート
const double eps = 1e-8;
double l,r,midl,midr;
///分别定义讨论区间的左,右,1/3处midl,2/3处midr
while(r-l>eps){
midl = l+(r-l)/3.0;
midr = r-(r-l)/3.0;
///这里的判断要看题目了,看是让你求最大还是最小
///这里是求最大值的时候,最小值就换一下就好啦 if(f(midl)>f(midr)){
r = midr;
}
else{
l = midl;
}
}