题目大意:
分pie给小朋友,有N个派,F+1个小朋友,求每个小朋友可以分到的最大的派,派不可以是拼凑起来的。
题目分析:
注意精度问题,计算时取整,不要忘了有F+1个人。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long LL;
const int N=100000+999;
const double pi=3.1415926535898;
int n,m;
double num[N];
bool f(double d)
{
//注意只能在每个蛋糕上切出一部分,不能组合蛋糕
int sum=0;
for(int i=0;i<n;i++)
{
sum=sum+floor(num[i]/d);//一个蛋糕能分成几个算几个
}
//判断是否能分出m+1个蛋糕
if(sum>=m+1) return true; //d太小可以向右区间搜索
else return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(num,0,sizeof(num));
double x;
for(int i=0;i<n;i++)
{
scanf("%lf",&x);
num[i]=x*x*pi; //计算出体积
}
sort(num,num+n); //让体积按照从小到大
double l=0,r=num[n-1];
while(r-l>1e-5) //由于精度可以有误差
{
//二分搜索
double mid=(l+r)/2.0;
if(f(mid)) l=mid;
else r=mid;
}
printf("%.4f\n",l);
}
return 0;
}