题目大意:将n块蛋糕分成F+1份,不允许拼接,求每个人能得到的蛋糕最大的面积。
题目解析:二分法,判段每个人是否能得到面积为X的蛋糕,判断时:每个蛋糕能切成多少块面积为X的蛋糕,若能切出多余等于F+1份,则说明每个人能得到面积为X的蛋糕!
本题要注意精度、
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define MAX 10010
double PI = acos(-1);
double s[MAX];
int n,f;
double max(double x,double y)
{
return x>y?x:y;
}
int ok(double x)
{
int i,j;
int sum=0;
for (i=0;i<n;i++)
{
sum+=floor(s[i]/x);
//printf("%d ",sum);
}
//printf("%I64d\n",x);
if (sum>f)
return 1;
else
return 0;
}
int main()
{
int T;
//printf("%lf\n",PI);
scanf("%d",&T);
while (T--)
{
int i,j,r;
double maxs=0;
scanf("%d%d",&n,&f);
for (i=0;i<n;i++)
{
scanf("%d",&r);
s[i]=r*r*PI*100000;
maxs=max(maxs,s[i]);
//printf("%lf\n",s[i]);
}
double L=0,R=maxs;
//printf("%I64d\n",R);
while (R-L>0)
{
double M=L+(R-L+1)/2;
if (ok(M))
{
L=M;
}
else
{
R=M-1;
}
}
//L+=5;
printf("%.4lf\n",L/100000.0);
}
return 0;
}