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);
    }
}


posted @ 2013-09-25 02:19  814jingqi  阅读(158)  评论(0编辑  收藏  举报