一、题目编号:
1003
二、简单题意:
F个朋友和我平均分N个pie,并且每个人只能从一块蛋糕得到自己的那一份,分得的蛋糕大小要一样。给出每个pie的半径大小,求每个人所分的pie的最大体积。
三、解题思路形成过程
利用二分法即可。总人数=朋友数+1,千万不要忘记加1。输入的是半径,而最终要求的是最大体积,因此应将半径转换成相应的体积。将每一个pie的体积加起来便得到总体积。若每个人的pie恰好能从一个pie中分得并且能把所有的pie恰好分完,那么每个人所分pie的最大体积便为总体积除以总人数。二分查找的区间为0到最大体积之间,通过取中间值,将区间分为两个小区间,判断是否每个人的pie恰好能从一个pie中分得,从而判断是选择左区间还是右区间。
四、感想
一定注意不能忘了自己!!!一定要注意加1!!
五、AC代码
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
int main()
{
double p=acos(-1.0);
int t;
cin>>t;
while(t--)
{
int n,f;
cin>>n>>f;
f++;
double r,ri[n];
for(int i=0;i<n;i++)
{
cin>>r;
ri[i]=p*r*r;
}
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
int main()
{
double p=acos(-1.0);
int t;
cin>>t;
while(t--)
{
int n,f;
cin>>n>>f;
f++;
double r,ri[n];
for(int i=0;i<n;i++)
{
cin>>r;
ri[i]=p*r*r;
}
sort(ri,ri+n);
double max=ri[n-1],min=0,mid;
mid=(max+min)/2;
while(1)
{
if(max-min<1e-7)
{
cout<<fixed<<setprecision(4)<<mid<<endl;
break;
}
else
{
int num=0;
for(int i=0;i<n;i++)
num+=ri[i]/mid;
if(num>=f)
min=mid;
else
max=mid;
}
mid=(max+min)/2;
double max=ri[n-1],min=0,mid;
mid=(max+min)/2;
while(1)
{
if(max-min<1e-7)
{
cout<<fixed<<setprecision(4)<<mid<<endl;
break;
}
else
{
int num=0;
for(int i=0;i<n;i++)
num+=ri[i]/mid;
if(num>=f)
min=mid;
else
max=mid;
}
mid=(max+min)/2;
}
}
}
}
}