网上有些解题报告在二分查找的精度上是照猫画虎的错误。
下面来指正。
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; else low=mid; } printf("%.4lf\n",low*pi); } int main() { int exp; scanf("%d",&exp); while(exp--) { datain(); bfind(); } }
原文地址:http://blog.csdn.net/stl112514/article/details/34097453