首页 > 代码库 > poj3122

poj3122

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


下面来指正。

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();
	}
}