题意:给出n个朋友,m个苹果派,再给出m个苹果派的半径,求出可以分给n个朋友一摸一样的苹果派的最大面积(不可以拼凑,只可以是一整块)。
思路:贪心+二分
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
#define pi acos(-1.0)
#define exp 1e-5
int s[10005];
typedef long long ll;
int n,f;
int judge(double mid)
{
ll sum=0;
for(int i=1;i<=n;i++)
{
sum+=(int)(1.0*s[i]*s[i]*pi/mid);
}
return sum>=(f+1)? 1:0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double sum=0.0;
scanf("%d%d",&n,&f);
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
sum+=1.0*s[i]*s[i]*pi;
}
double l=0.0,r=sum,mid;
while(r-l>=exp){
mid=(l+r)/2.0;
if(judge(mid))
l=mid;
else
r=mid;
}
printf("%.4lf\n",l);
}
return 0;
}