您的位置:首页 > 其它

2016sdau课程练习专题二 1003

2016-04-18 12:26 453 查看
1.题目编号

1003

2.简单题意

题目要求给出n个蛋糕的半径,还有总共m+1个人,要求每个人分的蛋糕必须是完整的一块,并且不能进行拼接,求最大的蛋糕

3.思路

由题意知不能进行拼接,所以可以在最大的和最小的中间范围进行二分算法,由此可以取出最大部分,还是二分算法

4.感想

二分的又一例题,虽然题目长了挺多,但还是二分算法的应用

5.代码

#include <iostream>

#include <cstring>

#include <cmath>

#include <algorithm>

using namespace std;

const double pi=acos(-1.0);

double a[10005];

int n,m;

int check(double mid)

{

    int i;

    int sum=0;

    for(i=0;i<n;i++)

    {

        sum+=int(a[i]/mid);

        if(sum>=m)

            return 1;

    }

    return 0;

}

int cmp(double a,double b)

{

    return a>b;

}

int main()

{

    int T,i,j;

    double l,r,s;

    cin>>T;

    while(T--)

    {

        cin>>n>>m;

        m++;

        for(i=0;i<n;i++)

        {

            cin>>a[i];

            a[i]=a[i]*a[i]*pi;

        }

        sort(a,a+n,cmp);

        l=0;

        r=a[0];

        if(m<n)

            n=m;

        while(r-l>1e-5)

        {

            s=(r+l)/2;

            if(check(s))

                l=s;

            else

                r=s;

        }

        printf("%.4lf\n",l);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: