经典二分题,适合练手。
题目链接点此
思路:先建一个数组存放各个派的体积值,用最大的派进行二分操作;再进行逐一派体积的检验,看是否符合题意。符合,右区间继续;不符合,往左区间继续。(注意精度问题和浮点数问题)。
#include <bits/stdc++.h>
using namespace std;
#define PI 3.141592653589//圆周率精度需注意。
double a[10005],x,sum;
int n,f;
bool cee(double x)//bool函数判断取值是否符合题意。(贪心算法)
{
int s=0;
for(int i=1;i<=n;i++)
{
s+=int(a[i]/x);//逐个派求能切出多少个mid体积的派;
}
return s>=f;
}
int main()
{
scanf("%d%d",&n,&f);
f++;//自己也要一块哦。
for(int i=1;i<=n;i++)
{
scanf("%lf",&x);
a[i]=PI*x*x;
sum=max(sum,a[i]);//得出最大体积派;
}
double l=0,r=sum,mid;//开始二分;
while(l+0.000001<r)//二分精度
{
mid=(l+r)/2;
if(cee(mid)) l=mid;
else r=mid;
}
printf("%.3lf",l);//由于精度足够,所以这里输出r,l都可以。
return 0;
}