这道题刚开始没想到要用枚举,一直以为是贪心。后来经指纹兄提醒,才恍然大悟,看来做题还是不够啊。。
思路:对所有可能的情况二分,但此处有个地方需要注意(调了半天才被我发现的),因为蛋糕能分成的份数是一个整数,所以在二分查找中不能通过判等直接退出循环。即使当前得到了满足题意的蛋糕数,也要尝试让蛋糕的面积继续增大,直到不满足循环条件为止。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-6;
const double PI=acos(-1.0);
int p[10000];
int main()
{
int t,n,m,cnt;
double low,mid,up;
cin>>t;
while(t--)
{
cin>>n>>m;
m++;
low=up=0;
for(int i=0;i<n;i++)
{
scanf("%d",p+i);
p[i]*=p[i];
if(up<p[i])
up=p[i];
}
while(up-low>=eps)
{
mid=(low+up)/2;
cnt=0;
for(int i=0;i<n;i++)
cnt+=(int)(p[i]/mid);
if(cnt<m)
up=mid-eps;
else if(cnt>=m)//此处很重要
low=mid+eps;
}
printf("%.4lf\n",mid*PI);
}
return 0;
}