愁啊,这精度问题真是让人不知所措啊,思路正确因为精度问题卡在那了,最初做题的时候double数据强转成int,
直接转,后来随着做题,因为在强转的时候没有加0.01错了很多次,所以就养成了,强转是+0.01的习惯,而今天做的这个题目是必须不能加,加了就错,直接强转就可以了。
[cpp]
#include
#include
#include
#define PI 3.1415926535898
#define EQS 1e-7
double a[11000];
int n,m;
int main()
{
double binary_search(double l,double r);
int t,i;
double res,max;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
m++;
for(i=0,max=0;i<=n-1;i++)
{
scanf("%lf",&a[i]);
if(a[i]>max)
{
max=a[i];
}
}
res=binary_search(0,max*max*PI);
printf("%.4lf\n",res);
}
return 0;
}
int check(double mid)
{
int s=0,i;
for(i=0;i<=n-1;i++)
{
s+=(int)(a[i]*a[i]*PI/mid);
}
if(s>=m)
{
return 1;
}else
{
return 0;
}
}
double binary_search(double l,double r)
{
int t;
double mid;
while(!(fabs(r-l)<=EQS))
{
mid=(r+l)/2.0;
if(!check(mid))
{
r=mid;
}else
{
l=mid;
}
}
return l;
}