问题
分析
这道题和前面的题目有些相似之处,类似于最小值最大问题,但并不是,因为每个人要求一样大,假设答案是x,那么有的人分到x是因为只能得到x那么大的,有的人得到x是因为最小的是x,再多就切不出来了,实际上可以拿到一块大于x的派。
矛盾:只有一种矛盾,x太大,每块派只能切出块,加在一块小于f+1
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
using namespace std;
typedef long long LL;
const int maxn=10005,Inf=0x3f3f3f3f;
int T,n,f,pie[maxn];
double s[maxn],maxs;
inline bool check(double x){
int ans=0;
for(int i=0;i<n;++i){
ans+=s[i]/x;
}
return ans>=f;
}
int main(void){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&f);
++f;
maxs=-1;
for(int i=0;i<n;++i) {
scanf("%d",&pie[i]);
s[i]=M_PI*pie[i]*pie[i];
maxs=max(maxs,s[i]);
}
double left=0,right=maxs;
while(right-left>1e-6){
double mid=(left+right)/2;
if(check(mid)) left=mid;
else right=mid;
}
printf("%.4lf\n",left);
}
return 0;
}
来源:CSDN
作者:carut
链接:https://blog.csdn.net/zpf1998/article/details/104581883