题目的整体思想就是二份答案,将复杂度降低。
 1#include<stdio.h>
 2#include<math.h>
 3double ri[10005];
 4int judge(double m,int pie_n,int friend_n,double *p)
 5{
 6    int i,sum=0;
 7    for(i=1;i<=pie_n;i++)
 8    {
 9        sum+=int((p[i]*acos(-1))/m);
10    }

11    if(sum>friend_n)
12        return 1;
13    else
14        return 0;
15}

16double abs(double ll)
17{
18    if(ll<0)
19        return ll*(-1);
20    else
21        return ll;
22}

23int main()
24{
25    int t,pie_n,friend_n,i;
26    scanf("%d",&t);
27    while(t--)
28    {
29        double mm=0;
30        scanf("%d%d",&pie_n,&friend_n);
31        for(i=1;i<=pie_n;i++)
32        {
33            scanf("%lf",&ri[i]);
34            ri[i]=ri[i]*ri[i];
35            if(ri[i]>mm)
36                mm=ri[i];
37        }

38        double min=0,max=mm*acos(-1),mid;
39        while(abs(max-min)>0.000005)
40        {
41            mid=(max+min)/2;
42            if(judge(mid,pie_n,friend_n,ri))
43            {
44                min=mid;
45            }

46            else
47            {
48                max=mid;
49            }

50        }

51        printf("%.4lf\n",mid);
52    }

53    return 0;
54}

55