poj3122

来源:互联网 发布:广州周末 知乎 编辑:程序博客网 时间:2024/06/07 10:01

网上有些解题报告在二分查找的精度上是照猫画虎的错误。


下面来指正。

absolute error of at most 10−3.这句话的意思是绝对误差最大为10−3

所谓绝对误差,就是说预测值跟准确值之差的绝对值。

那么二分查找的精度最小应该设置为10−4因为这样,得出的预测值跟准确值之差是不会超过10−3的。

所以以后碰到类似的描述,二分查找的精确度只需要往后面退一位即可。


其它的话,不会实数二分查找的同学,看看代码就很容易懂了,其它的也没什么好说的了。

#include<iostream>using namespace std;const int Max=10010;const double esp=1e-4,pi=3.14159265359;int num_p,num_f,p[Max];double high,low,mid;void datain(){int i;low=high=0;scanf("%d%d",&num_p,&num_f),num_f++;for(i=0;i<num_p;i++)scanf("%d",&p[i]),p[i]*=p[i],high=max(high,(double)p[i]);}void bfind(){int sum,i;while(high-low>esp){sum=0;mid=(high+low)/2;for(i=0;i<num_p;i++)sum+=(int)(p[i]/mid);if(sum<num_f)high=mid;elselow=mid;}printf("%.4lf\n",low*pi);}int main(){int exp;scanf("%d",&exp);while(exp--){datain();bfind();}}


0 0