题目描述
题意:作者要开一个生日party,他现在拥有n块高度都为1的圆柱形奶酪,已知每块奶酪的底面半径为r不等,作者邀请了f个朋友参加了他的party,
他要把这些奶酪平均分给所有的朋友和他自己(f+1人),每个人分得奶酪的体积必须相等(这个值是确定的),形状就没有要求。现在要你求出所有人都能够得到的最大块奶酪的体积是多少?
要求是分出来的每一份必须出自同一个pie,也就是说当pie大小为3,2,1,只能分出两个大小为2的,剩下两个要扔掉。
输入
T组测试数据 1<=T<=100
n,f n块高度都为1的圆柱形奶酪,f个人 1 ≤ n,f ≤ 10 000
每块奶酪的底面半径为r, 1 ≤ ri ≤ 10 000
输出
现在要你求出所有人都能够得到的最大块奶酪的体积是多少?保留四位小数
样例输入
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
提示
题意:作者要开一个生日party,他现在拥有n块高度都为1的圆柱形奶酪,已知每块奶酪的底面半径为r不等,作者邀请了f个朋友参加了他的party,
他要把这些奶酪平均分给所有的朋友和他自己(f+1人),每个人分得奶酪的体积必须相等(这个值是确定的),形状就没有要求。现在要你求出所有人都能够得到的最大块奶酪的体积是多少?
要求是分出来的每一份必须出自同一个pie,也就是说当pie大小为3,2,1,只能分出两个大小为2的,剩下两个要扔掉。
输入
T组测试数据 1<=T<=100
n,f n块高度都为1的圆柱形奶酪,f个人 1 ≤ n,f ≤ 10 000
每块奶酪的底面半径为r, 1 ≤ ri ≤ 10 000
输出
现在要你求出所有人都能够得到的最大块奶酪的体积是多少?保留四位小数
样例输入
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
提示
PI = 3.1415926535897932;
**找出每人可分得的体积区间,在这个区间里面通过二分查找最优解
**注意double类型的二分查找的判断条件是 high-low>0.000001;
#include <iostream>
#include <cstdio>
const double PI=3.1415926535897932;
using namespace std;
double pie[10100];
int main()
{
int N;
cin>>N;
while(N--)
{
int n,f;
double low,high,sum,mid;
cin>>n>>f;
++f;
int i,count;
for(i=0,sum=0;i<n;++i)
{
cin>>pie[i];
pie[i] *= pie[i];
sum +=pie[i];
}
low = 0;//每人可分得的最小值
high = sum/f;//每人可分得的最大值
while(high-low>0.000001)//二分搜索最优解
{
mid = (low+high)/2;
count = 0;
for(i=0;i<n;i++)
count += (int)(pie[i]/mid);
if(count>f) //如果比实际人数多 就说明我们分小了,
low = mid;
else if(count<f)//如果比实际人数少,说明分大了,
high = mid;
else
low = mid;//如果于实际人数一样,根据本题,我么可以试着再放大一点试试!
}
cout<<mid*PI<<endl;
}
return 0;
}