一.实数二分法模板
先上模板
1.模板
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
//for(int i=0;i<100;i++)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
2.讲解
实数二分因为没有整数二分的取整问题,编码比整数二分更简单。
其中,循环用两种方法都可以: while (r - l > eps)
for(int i=0;i<100;i++)
如果用for循环,在循环内二分,执行100次相当于1/2的100次方与等于1/10的30次方的精度。
但是for比while循环次数太多,计算量过大,有时间会超时!eps精度问题,过小的eps会超时,过大的会输出错误答案。
二.习题
通过上面模板讲解,我相信大家已经了解了实数二分思想,快在本地编译器上练习一下吧!
题目描述:
题目讲解:
板子题,注意把r等于输入的数,和check函数写法
check函数pow(mid,3)<=eps,不用注意边界直接套入模板
完整代码:
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-7;
int main(){
double n,m;
cin>>n;
while(n--){
cin>>m;
double l=0,r=m;
while(r-l>eps){
double mid=(r+l)/2;
if(pow(mid,3)>=m) r=mid;
else l=mid;
}
printf("%0.3lf\n",l);
}
return 0;
}