J. Pie 典型的二分求解

 

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


你可能感兴趣的:(J. Pie 典型的二分求解)