一开始想用讨论的方式来解决,然后发现情况非常复杂而且有些地方没法用讨论解决。只能判断且很好判断一个值是否可行,然而却没法很直观的求出最优解。
那就二分吧。
代码
#include<bits/stdc++.h>
#define maxn 10010
using namespace std;
const double PI=acos(-1);
const double eps=1e-4;
int N,F;
double MAX;
double S[maxn];
bool ok(double ans)
{
int cnt=0;
for(int i=N;i>=1;i--)
{
if(S[i]<ans) break;
cnt+=floor(S[i]/ans);
}
return cnt>=F+1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
MAX=0;
scanf("%d %d",&N,&F);
double temp;
for(int i=1;i<=N;i++)
{
scanf("%lf",&temp);
S[i]=PI*temp*temp;
MAX=max(MAX,S[i]);
}
sort(S+1,S+1+N);
double l=0;
double r=MAX;
while(abs(r-l)>eps)
{
double m=(l+r)/2;
if(ok(m)) l=m;
else r=m;
}
printf("%.4lf\n",l);
}
return 0;
}