题目描述:
将n块馅饼分给(m+1)个人,每人大小相同,并且每人的馅饼必须只能来自同一块馅饼,怎样分才能让大家分的馅饼最多。
题目类型:
二分法的应用。
源代码:
#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;
#define N 10004
#define PI acos(-1.0)
double r;
double area[N];
int n;
int f;
bool Judge(double mid,double a[]) //判断馅饼按照mid分法能分给多少人
{
int count=0;
int i;
for(i=0;i<n;i++)
{
count=count+(int)(a[i]/mid);
}
if(count>=f+1) //注意等号放到哪边,放下边就不对了
return false;
else
return true;
}
int main()
{
int group;
int i;
double sum=0;
double low,high,mid;
cin>>group;
while(group--)
{
cin>>n>>f;
sum=0;
for(i=0;i<n;i++)
{
cin>>r;
area[i]=PI*r*r;
sum=sum+area[i];
}
low=0; //下限一般都是0
high=sum/(f+1); //上限为所有馅饼面积和/人数
while(high-low>1e-6)
{
mid=(low+high)/2;
if(!Judge(mid,area)) //馅饼分多了,说明mid 小了
low=mid;
else
high=mid;
}
cout<<fixed<<setprecision(4)<<mid<<endl;
}
return 0;
}
本题注意临界条件的判断,即Judge函数的返回值。