J. Pie
我的生日来临,通常会用馅饼招待客人。是N个大小不同,口味不同的馅饼。我有F个朋友,他们会来参加我的生日宴会,他们每个人都会从某一块饼中分到一部分,而不是从某几块饼中各自分一部分(这么做会显得很乱的!)。我们每个人得到的都是同样大小的饼(形状可以不同),所有的馅饼都是圆柱形的,它们有同样的高度,但是半径可以是不一样的。我们所能得到的最大的馅饼尺寸是多少?
Input
一行包括一正整数:测试组数。接下来是每组数据说明:
l 一行有2个整数N和F(1≤N,F≤10 000),分别是馅饼和朋友的数量。
l 一行有N个整数ri(1≤ri≤10 000),分别表示N个馅饼的半径。
Output
对每组测试,输出一行,表示我和我的朋友所能达到的最大的馅饼尺寸(保留小数6位)。
Sample input | Sample output |
3 3 3 4 3 3 1 24 5 10 5 1 4 2 3 4 5 6 5 4 2 | 25.132741 3.141593 50.265482
|
#include<stdio.h>
#include<math.h>
const double pi=acos(-1); //对于pi这个来讲以后切记用这个来赋值
double a[11000];
int main()
{
int x,ji;
scanf("%d",&x);
while(x--)
{
int i,n,f;
scanf("%d %d",&n,&f);
f+=1;
double sum=0,max,min,middle;
for(i=1;i<=n;i++)
{
scanf("%lf",&a[i]);
a[i]=a[i]*a[i];
sum+=a[i];
}
max=sum/f; //确定最大值
min=0;
while(max-min>0.00000001) 当两者的差距做够小时 middle ,max,min的值就都一样了
{
ji=0;
middle=(max+min)/2;
for(i=1; i<=n; i++)
{
ji+=(int)(a[i]/middle);
}
if(ji>=f)min=middle; //这是典型的二分的条件
if(ji<f)max=middle;
}
printf("%.6lf\n",pi*middle);
}
}