题意:给出n个蛋糕的半径,m个人,求将蛋糕分给m+1个人每个人得到的蛋糕面积相同,求每个人能得到的最大面积。每个人得到的蛋糕必须是整块的,不能拼起来。
题解:二分每个人能得到的最大面积,判断一下当前面积下能否分成。
AC代码:
#include<stdio.h>
#include<math.h>
#include<iostream>
#define eps 1e-5
#define pi acos(-1.0)
using namespace std;
double a[10005];
int n,m;
int judge(double x)
{
int i;
int sum = 0;
for(i = 0; i<n; i++)
{
sum+=int(a[i]/x);
if(sum>=(m+1))
return 1;
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
double ma=0;
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
a[i]=a[i]*a[i]*pi;
ma=max(ma,a[i]);
}
double l,r;
l=0,r=ma;
for(int i=0;i<1000;i++)
{
double mid=(l+r)/2;
if(judge(mid))l=mid;
else r=mid;
}
printf("%.4lf\n",l);
}
}