您的位置:首页 > 其它

1003-pie

2016-04-21 23:32 288 查看
1.题号: 1003-pie

2.题意:要办生日Party,有n个馅饼,有f个朋友,接下来是n个馅饼的半径。然后是分馅饼了,自己也要,大家都要一样大,形状没什么要求,但都要是一整块的那种,也就是说不能从两个饼中各割一小块来凑一块,饼的厚度是1,所以面积和体积相等。题目要求我们分到的饼尽可能的大!

3.解题思路:关于题目例如:面积为10的和6的两块饼,如果每人分到面积为5,则10分两块,6切成5,够分3个人,如果每人6,则只能分两个了。先求出每个pie'的面积,将最大的取出来maxn,sum是所有pie面积的总和,maxn/人数这是分到的最小的可能性,最大的一块分f+1个人;sum/人数是最大的可能性,所有的蛋糕正好都分完。得到了一个区间,然后二分查找,进行for循环,看剩下pie还能否继续分,如果能分出足够的人数就符合条件误差在1e-8之间,如果不符合就二分查找下去。pi
用反余弦求出,精度更高。

4.感想:这道题是在二分查找条件上又加了一个条件,跟前两道题异曲同工,还有初始化不能忘。

5.AC代码:

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>

using namespace std;

double pi=acos(-1.0);
double pie[10010];
double sum,maxn;
int main()
{
int i,n,f,t,radio,num;
double l,r,mid;
cin>>t;
while(t--)
{
cin>>n>>f;
f++;
maxn=sum=0;
for(i=0;i<n;i++)
{
cin>>radio;
pie[i]=pi*radio*radio;
maxn=max(pie[i],maxn);
sum+=pie[i];
}
l=maxn/f;
r=sum/f;
while(l+0.00001<r)
{
mid=(l+r)/2;
num=0;
for(i=0;i<n;i++)
num+=(int)(pie[i]/mid);
if(num<f) r=mid;
else l=mid;
}
printf("%.4lf\n",l);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索