强转是+0.01的习惯

2013-07-23 09:04:08 · 作者: · 浏览: 133

  愁啊,这精度问题真是让人不知所措啊,思路正确因为精度问题卡在那了,最初做题的时候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;

  }