poj 3122 Pie 二分答案
题目地址: 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); } }