好多二分题一看题目头就晕。。。挑个容易理解的下手
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
const double pi=3.14159265359;
const double esp=1e-6;
using namespace std;
int main()
{
int t;
int n,m;
int i,j;
int count;
double a[10005];
double maxv;
cin>>t;
while(t--)
{
cin>>n>>m;
m=m+1;
for(i=1;i<=n;i++)
{
cin>>a[i];
a[i]*=a[i];
if(maxv<a[i])
{
maxv=a[i];
}
}
double low=0.0;
double high=maxv;
double mid;
while(high-low>esp)
{
mid=(low+high)/2;
count=0;
for(i=1;i<=n;i++)
{
count+=int(a[i]/mid);
}
if(count<m)
{
high=mid;
}
else
{
low=mid;
}
}
printf("%.4lf\n",mid*pi);
}
return 0;
}
精度卡好就没什么问题了,每块能分的份数的取整。