题目地址: http://poj.org/problem?id=3122
还是找到了单调函数--分给m人对最大尺寸f(m) 是m的不增函数,那么具体给定m是,二分f(m)使用>=f+1 l=mid 而不是>来保证尽可能取得大
细节: 应该直接二分答案,而不是算出比较精确的半径平方,最后*PI输出,会产生误差,然后PI用arccos(-1),否则也会wa
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
//const double PI=3.1415926535; //这样写就wa了 是精度不够?
const double PI=acos(-1.0);
int N,F;
int a[10005];
long long person_num(double x)
{
long long ans=0;
for(int i=0;i<N;i++)
{
ans+=a[i]*a[i]*PI/x;
}
return ans;
}
int main()
{
int T;
cin>>T;
while(T--)
{ double max_size=0;
cin>>N>>F;
double l=0,r=1000000000;
// 10000,0000 小了
double mid;
while(r-l>=1e-4)
{
mid=(l+r)/2;
if(person_num(mid)>=F+1) l=mid;
else r=mid;
}
printf("%.4lf\n",l);
}
}