也是一个二分的题, 然后学了一个新招, 控制循环次数来控制二分,
#include <iostream>
#include <string.h>#include <stdlib.h>
#include <stdio.h>
#include <cmath>
using namespace std;
#define MAXN 11111
#define PI acos(-1.0)
#define eps 1e-8
double pie[MAXN];
double l, r;
void solve( int n, int m)
{
int cnt = 0;
double mid;
double ans = 0;
int count = 1111;
// while(count--)
while(l < r - 0.0001){
mid = ( l + r)/2.0;
//cout<<l<<"---"<<r<<"----"<<mid<<endl;
cnt = 0;
for( int i = 0; i < n; i++)
if(pie[i] >= mid )
cnt += pie[i]/mid;
if(cnt < m+1)
r = mid;
else
{
ans = mid;
l = mid;
}
}
printf("%.4lf\n",ans);
}
int main()
{
int n, m, t;
scanf("%d",&t);
while(t--)
{
double sum = 0, val;
scanf("%d %d",&n, &m);
for( int i = 0; i < n; i++)
{
scanf("%lf",&val);
pie[i]= val * val * PI;
sum += pie[i];
}
l = 0.0, r = sum/((m+1)*1.0);
solve( n, m);
}
}