poj 3122 二分水题

6 篇文章 0 订阅

题意不难:有n块高度都为1但底面半径为r不等的圆柱体奶酪,作者邀请了f个朋友参加了他的party,他要把这些奶酪平均分给f+1人,每个人分得奶酪的体积必须相等(这个值是确定的),形状就没有要求。现在要你求出所有人都能够得到的最大块奶酪的体积是多少


直接二分即可

下界为0,即每人都分不到pie
上界为MaxSize,每人都得到整个pie,而且那个pie为所有pie中最大的

注意下精度问题就好

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#define rep(i, j, k) for(int i = j; i <= k; i++)

using namespace std;

const double pi = acos(-1.0);
double a[10005];
int n,m;

bool check(double mid)
{
    int sum = 0;
	rep (i, 1, n)
    {
        sum+=int(a[i]/mid);
        if(sum>=m)
            return 1;
    }
    return 0;
}

int cmp(double a,double b)
{
    return a>b;
}

int main()
{
	int ti;
	cin >> ti;
    while(ti--)
    {
        scanf("%d%d",&n,&m);
        m++;
		rep (i, 1, n)
        {
            scanf("%lf",&a[i]);
            a[i] = a[i]*a[i]*pi;
        }
        sort(a + 1,a + 1 + n,cmp);
		double l = 0, r = a[1];
        if(m<n)
            n = m;
        while(r - l > 1e-5)
        {
            double mid = (r+l)/2;
            if(check(mid))
                l = mid;
            else
                r = mid;
        }
        printf("%.4f\n",l);
    }

    return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值