一道比较纯正的二分题目,也是比较简单的,它的大意是:有一堆派共N个,我有F个朋友来分这些派,问最多可以分得大小。
这些派是圆柱形的高都是1。告诉你所有的半径,求可以分到最大的面积(注意派是可以用刀 分开的但是分开后哪一些不够一份的地方就不能再要了,所以我们需要将最大的 一小份(也就是单元)用二分求出来,)。
注意:这里只要求小数点后4位,所以精确度到-5即可,如果数据卡的死,-8,-9可能会TLE。
#include<iostream>
using namespace std;
#include<stdio.h>
#include<cmath>
double a[10005];
const double PI=3.1415926535898;
const double L=1e-6;
int main()
{
int N;
int i,j,k;
int F,num;
double sum;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&F);
sum=0;
for(i=0;i<N;i++)
{
scanf("%lf",&a[i]);
sum+=PI*a[i]*a[i];
}
sum/=(F+1);
double low=0.0000;
double high=sum;
double mid=(low+high)/2;
while(high-low>L)
{
num=0;
for(i=0;i<N;i++)
num+=(int)(PI*a[i]*a[i]/mid);
if(num<(F+1))high=mid-L;
else low=mid+L;
mid=(low+high)/2;
}
printf("%.4lf\n",mid);
}
return 0;
}