J. Pie 典型的二分求解

来源:互联网 发布:淘宝几天自动确认收货? 编辑:程序博客网 时间:2024/06/07 06:25

 

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