您的位置:首页 > 其它

Pie(二分法)

2015-08-05 21:47 197 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/C

题意:

我过生日请了F个朋友参加我的生日party,m个蛋糕,我要把它平均分给每个人(包括我),每个人的蛋糕都是整块整块的,并且分的蛋糕大小要一样(形状可以不一样),每块蛋糕都是圆柱,高度都是1。每个朋友(包括我)最多可以分到的蛋糕面积是多少。

案例:

input

3

3 3

4 3 3

1 24

5

10 5

1 4 2 3 4 5 6 5 4 2

output

25.1327

3.1314

50.2655

思路分析:

采用二分查找,找出最大的面积所在区间。

逐步的缩小范围,最后当左右端点相差小于0.00001时,即可取左端点为最大的面积。

确定是左是右区间时,可以记录每个蛋糕的可以分的人数的和,比较它与F的大小就可以但到目的。

源代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int N,F;
double are[10010];
double pi=acos(-1.0);
bool judge(double area)
{
int count=0;
for(int i=0;i<N;i++)
{
count+=(int)(are[i]/area);       //记录每个蛋糕可以分到的人数的总和
}
if(count>=(F+1))    return true;         //不要忘记包括我
else return false;
}
void max_area(double maxn)
{
double l,r,mid;
l=0;r=maxn;
while(r-l>0.00001)         //二分
{
mid=(l+r)/2;
if(judge(mid)) l=mid;
else r=mid;
}
printf("%.4f\n",l);
}
int main()
{
int t,r;
cin>>t;
while(t--)
{
double maxn=-1;
cin>>N>>F;
for(int i=0;i<N;i++)
{
cin>>r;
are[i]=r*r*pi;
if(maxn<are[i])
maxn=are[i];
}
max_area(maxn);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: