题意:生日派对时,准备了n个圆柱形的pie,半径比一定相同,但高都为1,
邀请了f个朋友,加上自己一共f+1人,需要将n个pie分给f+1个人
要求:每个人分得的pie尺寸要一样大,
并且同一个人所分的pie要是从同一个pie上得到的,n个pie分完后可以有剩余
求:每个人最多可以分多少
分析:因为同一个人所分的pie都来自同一个pie,
若每个人所分的最大体积为a,那么比a小的pie肯定得舍弃。
将每个人最多分得的pie看成半径为r的圆柱,则最大尺寸为PI*r*r*1,
可以用二分算法,下界为0,上界为pie的最大半径
对于整形数据来说,进行二分的时候 ,可以有 low =mid+1 或high=mid-1;
而对于float 和 double 来说, 修改的时候 有 low =mid , high=mid
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int t,n,f;
const double pi=asin(1)*2;
double a[10010];
int main()
{
cin>>t;
double low,high,mid;
double sum;
while(t--)
{
low=0;
high=0;
cin>>n>>f;
f++;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]*=a[i];
if(a[i]>high)
high=a[i];
}
while(high-low>1e-6)
{
mid=(low+high)/2;
sum=0;
for(int i=1;i<=n;i++)
sum+=(int )(a[i]/mid); 如果按mid 来分的话,a[i]/mid 的时候,每个pie 只能分成整数份。所以强制转换成int
if(sum>=f)
low=mid;
else
high=mid;
}
cout<<fixed<<setprecision(4)<<pi*mid<<endl;
}
}