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); } }