|
Pie |
|
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
|
Total Submission(s): 109 Accepted Submission(s): 52 |
|
|
|
Problem Description My birthday is coming up and traditionally I‘m serving pie. Not just one pie, no, I have a number N of them, of various tastes and of various sizes. F of my friends are coming to my party and each of them
gets a piece of pie. This should be one piece of one pie, not several small pieces since that looks messy. This piece can be one whole pie though.
|
|
Input One line with a positive integer: the number of test cases. Then for each test case:
|
|
Output For each test case, output one line with the largest possible volume V such that me and my friends can all get a pie piece of size V. The answer should be given as a floating point number with an absolute error of at most 10^(-3).
|
|
Sample Input
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
|
|
Sample Output
25.1327
3.1416
50.2655
题意:
一个人要办生日part,有f个馅饼,n个朋友要来参加他的生日part,我们要做的是让着f个馅饼平均分给他的朋友,
形状可以不一样,但是大小要一样,也就是说馅饼的体积要一样,这馅饼的高都为1。这个简单,但是题目要求不能分
从一块一块的凑出来的馅饼。 思路: 用二分搜索,首先算出馅饼的总体积,然后再除以总人数,要注意总人数要加1,因为生日的主人也包括在内,总体积就是 大家能够的到的最大馅饼的体积,但是不能从一块到另一块凑出来,所以要进行二分搜索,mid=(l+r)/2,当达到题意是就退出 循环,输出mid.这里PI的精度要高一些,用acos(-1.0)。 代码: #include<cstdio>
#include<cmath>
#define PI acos(-1);
double v[10001];
int main()
{
int T,n,f,ri;
double l,r,mid,sum;
scanf("%d",&T);
while(T--)
{
r=l=0;
scanf("%d%d",&n,&f);
f++;
for(int i=0;i<n;i++)
{
scanf("%d",&ri);
v[i]=ri*ri*PI;
r+=v[i];
}
r/=f;
while(r-l>=1e-6)
{
sum=0;
mid=(l+r)/2.0;
for(int i=0;i<n;i++)
sum+=(int)(v[i]/mid);
if(sum>=f)
l=mid;
else r=mid;
}
printf("%.4lf\n",mid);
}
return 0;
}
|
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/a1967919189/article/details/47291411