题目大意:生日就要到了,准备了些披萨在生日party上和朋友一起享用。现在有n快披萨,要分为f+1(包括自己)份,每份的尺寸要一样(就是体积一样),形状可以不一样,而且每个人的那一份必须来自同一块披萨,问每个人分到的最大尺寸是多少。
分析:简单二分,水题。。这里有个小技巧可以减少计算量,计算的时候将 π 约去,最后输出答案的时候再乘上就好了。
代码:
#include <iostream>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
const int MAXN=1e4+5;
const double pi=4*atan(1.0);
const double eps=1e-6;
int t,n,f;
double v[MAXN];
bool judge(double size){
int count=0;
for(int i=0;i<n;++i){
count+=(int)(v[i]/size);
}
return count>f;
}
void solve(double lb,double rb){
double mid;
while(rb-lb>eps){
mid=(lb+rb)/2.0;
if(judge(mid)) lb=mid;
else rb=mid;
}
cout<<fixed<<setprecision(4)<<pi*mid<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin>>t;
while(t--){
cin>>n>>f;
double max_size=0;
for(int i=0;i<n;++i){
cin>>v[i];
v[i]*=v[i];
max_size=max(max_size,v[i]);
}
solve(0.0,max_size);
}
return 0;
}