D - Pie(实数二分)(最小值最大化)

我的生日快到了,传统上我在做馅饼。不只是一个馅饼,不,我有N个,口味各异,大小各异。我的F个朋友来参加我的聚会,他们每个人都得到一块馅饼。这应该是一块一块,而不是几个小块,因为看起来很乱。虽然这块可以是一个整体。

我的朋友很烦人,如果其中一个比其他人得到更大的回报,他们就会开始抱怨。因此,即使它们导致一些派变质(比破坏党派更好),它们也应均等大小(但不一定相等)。当然,我也想为自己准备一块馅饼,并且该块也应具有相同的大小。

我们所有人都能得到的最大单件尺寸是多少?所有的饼都是圆柱形的,并且高度都相同1,但是饼的半径可以不同。

输入:

带有正整数的一行:测试用例的数量。然后对于每个测试用例:
—一行包含两个整数N和F,且1 <= N,F <= 10000:派子数和朋友数。
—包含N个整数ri且1 <= ri <= 10000的一行:饼的半径。

输出:

对于每个测试用例,输出一行最大可能的音量V,这样我和我的朋友都可以得到一个大小为V的饼图。答案应该是一个浮点数,绝对误差最大为10 ^( -3)。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const double pi=acos(-1.0);//3.1415926535897
int n,m;
double a[10010];
bool check(double mid)
{
    int cnt=0;
    for(int i=0;i<n;i++)
    {
        cnt+=(int)(a[i]/mid);//强制转化为int型
    }
    return cnt>=m;
}
int main()
{
    int t,k;
    cin>>t;
    while(t--)
    {
     double r=0;
        scanf("%d%d",&n,&m);
        m++;
        for(int i=0;i<n;i++)
            {
                scanf("%d",&k);
                a[i]=pi*k*k;
              if(a[i]>r)
                r=a[i];
            }
         double l=0;
        for(int i=0;i<100;i++)
         {
             double mid=l+(r-l)/2;
             if(check(mid))
                l=mid;
             else
                r=mid;
         }
         printf("%.4f\n",r);
    }

    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值