LA3635派

来源:互联网 发布:查车架号软件 编辑:程序博客网 时间:2024/04/27 17:37
题意:
      有F+1个人来分n个圆形派,每个人分到的必须是一个整块的派,形状无所谓,每个人分到的必须一样多,给你每个派的半径,问每个人能分到的最大派的面积是多少。


思路:
      虽然不是求最小的最大或是最大的最小,但是这个题目依然可以用二分去做,我们枚举每个人分到的最大面积,这样就可以算出来这些派最多能够满足几个人的要求,然后去判断二分的方向,一开始eps写的有点小,TLE了一次,后来改大点AC了。




#include<stdio.h>
#include<math.h>


#define N 10000 + 10
#define eps 0.000001


double PI = acos(-1.0);


double ps[N];


bool ok(int mid ,int n ,int m)
{
     int Sum = 0;
     for(int i = 1 ;i <= n ;i ++)
     {
        Sum += int(ps[i] / mid);
     }
     return Sum >= m;
}
        
             


int main ()
{
    int n ,m ,i;
    double r ,Max;
    while(~scanf("%d %d" ,&n ,&m))
    {
        Max = 0;
        for(i = 1 ;i <= n ;i ++)
        {
           scanf("%lf" ,&r);
           ps[i] = PI * r * r;
           if(Max < ps[i]) Max = ps[i];
        }
        double low ,mid ,up ,Ans = 0;
        low = 0 ,up = Max;
        while(up - low >= eps)
        {
            mid = (low + up) / 2;
            if(ok(mid ,n ,m + 1))
            Ans = low = mid;
            else up = mid;
        }
        printf("%.5lf\n" ,Ans);
    }
    return 0;
}
        
        
            
        
   
        
           
    









0 0
原创粉丝点击