LA 3635

来源:互联网 发布:淘宝网图书人性的弱点 编辑:程序博客网 时间:2024/06/05 17:02

题干:

大意是f+1个人来分n个圆形派(每个的大小不一定相同)。每个人必须分得一整块,而且每个人分得的面积相同。求每个人分得的最大面积是多少。

分析:

看了看书上的分析,就是采用二分法,查找到合适的面积x,使得问题转化为“能否可以让每人得到一块x的派”。

代码:

#include <string.h>#include <iostream>#include <algorithm>#include <math.h>using namespace std;const int maxn = 10010;double num[maxn];int n,f;const double PI = acos(-1.0);bool ok(double m)//判断是否满足面积为x的时候,有足够的派分给f+1个人{    int sum = 0;    for(int i = 0;i < n;i++)    {        sum += floor(num[i] / m);    }    return sum >= (f + 1);}int main(){    int T;    cin>>T;    while(T--)    {        memset(num,0,sizeof(num));        scanf("%d%d",&n,&f);        int x;        double maxa = -1;        for(int i = 0;i < n;i++)        {            cin >> x;            num[i] = PI * x * x;            maxa = max(maxa,num[i]);        }        double mina = 0;        while(maxa - mina > 1e-5)        {            double M = (maxa + mina) / 2;            if(ok(M))                mina = M;            else                maxa = M;        }        printf("%.4lf\n",mina);    }    return 0;}


0 0