POJ 3122 Pie -二分查找

                                                                                               3122--Pie

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 23475 Accepted: 7316 Special Judge

 

http://poj.org/problem?id=3122

我的生日快到了,传统上我正在为馅饼做饭。 不只是一个馅饼,不,我有N个,各种口味和各种尺寸。 我朋友的朋友来参加我的聚会,他们每个人都会得到一块馅饼。 这应该是一块馅饼,而不是几块小块,因为它看起来很乱。 这件作品可以是一个完整的馅饼。

我的朋友非常讨厌,如果他们中的一个比其他人更大,他们就开始抱怨了。 因此,所有这些都应该得到相同大小(但不一定相同的形状)的碎片,即使这会导致一些馅饼被破坏(这比破坏派对更好)。 当然,我也想要一块馅饼,而且那块也应该是相同的大小。

我们所有人都能获得的最大尺寸是多少? 所有的馅饼都是圆柱形的,它们都具有相同的高度1,但是馅饼的半径可以是不同的。

输入:

一行带有正整数:测试用例的数量。 然后针对每个测试用例:
一行有两个整数N和F,1≤N,F≤10000:馅饼的数量和朋友的数量。
一行N个整数ri,1≤ri≤10000:馅饼的半径。
输出:

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

翻译题意:

我生日派对时,准备了N个圆柱形的pie,半径比一定相同,但高都为1,

我邀请了F个朋友,加上自己一共F+1人,需要将N个pie分给F+1个人

要求:每个人分得的pie尺寸要一样大,

并且同一个人所分的pie要是从同一个pie上得到的,n个pie分完后可以有剩余

求:每个人最多可以分多少?

分析设左界l=0,即每人都分不到;右界r=maxr的pie大小,即每人都得到整个pie,而且那个pie为所有pie中最大的

重点!同一个人所分的pie都来自同一个pie,

若每个人所分的最大体积为a,那么比a小的pie肯定得舍弃。(转自他人)

对当前上下界折中为mid,计算"如果按照mid的尺寸分pie,能分给多少人"​​​​​​​(直接在最大那块的面积与0之间二分求即可)

求某个pie(尺寸为size)按照mid的尺寸,能够分给的人数,就直接size / mid,舍弃小数就可以 (int (a[i]/mid))

重中之重:精度问题--1e-5

代码:

#include <iostream>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;

const int maxn=10000+10;
const double pi=3.141592653589;
int n,m;
double a[maxn],maxa;

void solve()
{
    double l=0,r=maxa*maxa*pi*10000,mid;
    int ans=0;
    while(r-l>1e-5)
    {
        ans=0;
        mid=(l+r)/2;
        for(int i=0;i<n;i++)
            ans+=int (a[i]/mid);
        if(ans<m)
            r=mid;
        else l=mid;
    }
    printf("%.3lf\n",l);
}
int main()
{
    cin>>n>>m;
    m++;
    maxa=0;
    double t;
    for(int i=0;i<n;i++)
    {
        scanf("%lf",&t);
        a[i]=t*t*pi;
        maxa=max(maxa,a[i]);
    }
    solve();
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值