分蛋糕

感谢微信平台 : 一天一道算法题 -----  一天多一点进步-----

先来段 废话:

已经 3 4天没更了 主要还是自己 太懒了 。。。。

好 让我们 开始吧

题目链接:

          touch  me 

是不是 有点长啊  最可恶的是 还有张 诱人的 馅饼  ---

        话说 有个很好的美国系列校园青春 sex movie ---  American Pie  --- 美国派----- 

题目大意:

  有F+1个人来分N个圆形蛋糕 每个人得到的必是一整块蛋糕 (不是由几块拼在一起的)面积要相同 求每个人最多能得到多大面积的蛋糕 ( 不必是圆形)

tips:

  这有点类似 你在寻找一个明确范围内寻找一个适合它的最大即最优的解

  既然我已经指明了 使用 二分思想 那么你只要知道 一个半径为R的蛋糕 只能切出 ( π * r * r )/(S) 这里的S就是你要分给每个人的蛋糕的面积 因为蛋糕不能是由几个蛋糕拼起来的 那么可以确定 可以划分的蛋糕 就是  cnt = ( π*r*r)/(S)的总和  这里的cnt 需要向下取整 就是 如果3.5 就取 3 就这意思

  好了 负罪感 down

  贴上我的代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;

int n , m;
const int size = 10010;
const double pi = 3.1415926535898 ;
double area[size];

bool choose( double s )
{
    int sum = 0;
    for( int i = 0 ; i<m ; i++ )
    {
        sum+=floor(area[i]/s);  //向下取整 3.5->3 人总是整数的 
    }
    return sum>=n+1;  //这是个很好的细节 相比你去写 If....else... 简洁 即美
}

int main()
{
    int t;
    double l , r , mid , mmax;
    scanf( "%d",&t );
    while( t-- )
    {
        memset( area , 0 , sizeof(area) );
        mmax = 0;
        scanf( "%d %d",&m,&n );//n+1个人 m个蛋糕 一开始 顺序弄错了
        for( int i = 0 ; i<m ; i++ )
        {
            scanf( "%lf",&area[i] );
            area[i] = area[i]*area[i]*pi;
            if( area[i]>mmax ) //找出这m块蛋糕的
                mmax = area[i];
        }
        l = 0;
        r = mmax;
        while( r-l>1e-5 )
        {
            mid = l + (r-l)/2;
            if( choose(mid) )
                l = mid;
            else
                r = mid;
        }
        printf( "%.4lf\n",l );
    }
    return 0;
}
转载地址 http://www.cnblogs.com/radical/p/3765486.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值