题意:n个圆柱体(高为1)披萨,想要平均分给f+1个人,每个人一块披萨体积相同形状可以不同,但是不能两块拼成一块。以下是n个披萨的半径(整数),输出每个人分得披萨的最大体积是多少,误差不超10^-3
测试数据:
输入:
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
输出:
25.1327
3.1416
50.2655
类似题目传送门:POJ - 1064
分析:用二分枚举披萨体积,l=0.0,r=最大的披萨体积。误差不超0.001就是保留4位小数,直接printf(".4lf")就行
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
typedef long long LL;
#define N 10005
const double PI = acos(-1.0);
using namespace std;
LL a[N],n;
LL orz(double x)
{
LL i,sum=0;
for(i=1;i<=n;i++)
{
sum=sum+(int)(a[i]*a[i]*PI/x);
}
return sum;
}
int main()
{
LL i,t,f;
cin>>t;
while(t--)
{
scanf("%lld%lld",&n,&f);
for(i=1;i<=n;i++)scanf("%lld",&a[i]);
double l=0.0,r=4e9;
while(fabs(r-l)>=1e-4)
{
double mid=(l+r)/2.0;
if(orz(mid)>=f+1)
l=mid;
else
r=mid;
}
printf("%.4f\n",r);
}
return 0;
}