上届:最大的饼的面积
下届: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);
}
}