雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

小数的二分查找——pku3122

Posted on 2011-08-29 21:51  huhuuu  阅读(409)  评论(0编辑  收藏  举报
上届:最大的饼的面积
下届:0
二分。。。
注意的是while条件与整数的二分查找有区别(r-l)>0.00001
取PI的技巧:const double PI=acos(-1.0);
View Code
#include<stdio.h>
#include
<math.h>

const double PI=acos(-1.0);
double a[10009];
int n,m;

double ss(double r)
{
return r*r*PI;
}

int much(double s)//当面积为S时可以把这些饼分成几个有效饼
{
int i;
int add=0;
for(i=0;i<n;i++)
{
add
+=(int)(a[i]/s);
}
return add;
}

int main()
{
int t;
scanf(
"%d",&t);
while(t--)
{

scanf(
"%d%d",&n,&m);
m
++;

double max;
int i,R;

for(i=0;i<n;i++)
{
scanf(
"%d",&R);
a[i]
=ss(R*1.0);
if(a[i]>max)
max
=a[i];
}

double l=0,r=max,mid;
int add;
while(((r-l)>0.00001)||(add<m))//当r,l不是很接近,或是饼分的不够时
{
mid
=(l+r)/2.0;
add
=much(mid);

if(add>=m)//分的饼数量多于等于要求量时 尽可能扩大饼的面积
{
l
=mid;
}
else
{
r
=mid;
}
}
printf(
"%.4lf\n",mid);
}
}