【二分】【简单】分披萨

hdu1003
时间限制:5000/1000ms (Java/其他)内存限制:65536/32768K (Java/其他)
全部提交(s): 21个接受的提交(s): 8。
问题描述
我的生日快到了,传统上我是在做馅饼。
不只是一个馅饼,不,我有一个数字N,各种口味和各种大小。
我的朋友们都来参加我的聚会,每个人都分到一块馅饼。
这应该是一块一块的,而不是几个小块,因为看起来很乱。
这一块可以是一整块。
我的朋友们都很烦人,如果他们中的一个比其他人得到了更大的一块,他们就开始抱怨。
因此,他们所有人都应该得到同样大小的(但不一定是相同形状的)碎片,即使这会导致一些馅饼被破坏(这比破坏聚会好)。
当然,我也想要一块馅饼,这一块也应该是同样大小的。
<br><br>什么是我们所有人能得到的最大的尺寸?
所有的馅饼都是圆柱形的,它们的高度都是一样的,但是馅饼的半径是不同的。
输入
一个带正整数的线:测试用例的数量。
然后对于每个测试用例:<br>——一行有两个整数N和F和1 <= N, F <= 10000:饼的数量和朋友的数量。
<br>---一行有N个整数ri和1 <= ri <= 10000:派的半径。<br>。
输出
对于每个测试用例,输出一行,最大可能体积V,这样我和我的朋友们都能得到一块馅饼的大小诉答案应该是作为一个浮点数的绝对误差最多10 ^(3)。

 

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double pi = acos(-1.0);
int F,N;
double V[10001];
bool check(double x)
{
    int num=0;
    for(int i = 0; i < N;i++)
    {
        num += int(V[i]/x);
    }
    if(num>=F)
    return true;
    else return false;
}
int main()
{
    int t,r;
    double v_sum,left,right,mid;
   cin>>t;
    while(t--)
    {
       cin>>N>>F;
        F = F+1;//加上自己
        for(int i = 0; i < N; i++)
        {
            cin>>r;
            V[i] = pi*r*r;
            v_sum += V[i];
        }
       right = v_sum/F;
        left = 0.0;
        while((right-left)>1e-6)
        {
            mid = (left+right)/2;
            if(check(mid))
            left = mid;
            else right = mid;
        }
        printf("%.4f\n",mid);
    }
    return 0;
}

 

 

 


版权声明:本文为u011590573原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。