POJ 3122 Pie【二分答案】

<题目链接>

题目大意:

将n个半径不一但是高度为1的蛋糕分给 F+1个人,每个人分得蛋糕的体积应当相同,并且需要注意的是,每个人分得的整块蛋糕都只能从一个蛋糕上切下来,而不是从几个蛋糕上东拼西凑而成。现在问每人分得蛋糕的体积是多少。

解题分析:
就是普通的二分答案,但是要注意一下浮点型二分的结构,与整型二分略有不同。

 

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double PI=acos(-1.0);
int n,m,arr[10010];
const double eps=1e-6;

bool juge(double x){
    int sum=0;
    for(int i=1;i<=n;i++){
        sum+=(int)(arr[i]/x);   //当每个人得到x体积蛋糕时,最多能够分给几个人
    }
    return sum>=(m+1); 
}

int main(){
    int T;scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        int maxv=-0x3f;
        for(int i=1;i<=n;i++){
            scanf("%d",&arr[i]);
            arr[i]*=arr[i];      //先只进行半径的平方,不乘上pi,防止损失精度
            maxv=max(maxv,arr[i]);
        }
        double l=0,r=maxv*1.0;
        while(r-l>eps){    
            double mid=(l+r)/2;
            if(juge(mid))l=mid;
            else r=mid;
        }
        printf("%.4lf\n",l*PI);
    }
    return 0;
}

 

 

2018-09-20

posted @ 2018-09-20 23:41  悠悠呦~  阅读(207)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end