HDU1969 PIE 二分查找

来源:互联网 发布:列表 js 点击显示详情 编辑:程序博客网 时间:2024/05/16 10:31

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1969

题目意思:有n个块饼和M+1个人要分饼,且每人一块,饼不能拼接,要求每人分得的最大的饼的面积
思路:二分,先用总的饼的面积 / 人数 = 理论上最大面积,取为上界high,再求一个mid ,一直到循环退出,不能在中途找到时结束循环

if(饼能分成M+1份)

{   left = mid }   

else  { right = mid }



#include<cstring>#include<string>#include<fstream>#include<iostream>#include<iomanip>#include<cstdio>#include<cctype>#include<algorithm>#include<queue>#include<map>#include<set>#include<vector>#include<stack>#include<ctime>#include<cstdlib>#include<functional>#include<cmath>using namespace std;#define PI acos(-1.0)#define MAXN 100005#define eps 1e-7#define INF 0x7FFFFFFF#define ff sqrt(5.0)double val[100005];int n,m,t;int check(double x){    int sum=0;    for(int i = 0;i < n;i++)    {        sum += val[i] / x;    }    if(sum >= m + 1) return 1;    else return 0;}double mid,r,l,maxval;int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        maxval = 0;        for(int i = 0;i < n; i++)        {            scanf("%lf",&val[i]);            val[i] = val[i] * val[i] * PI;            maxval += val[i];        }        mid = maxval / (m + 1);        r = mid;        l = 0.0;        while(r - l > 1e-7)        {          if(check(mid))          {              l = mid;          }          else          {              r = mid;          }          mid=(l + r) / 2.0;        }        printf("%.4lf\n",mid);    }    return 0;}



0 0