简单题意:生日聚会上,来到的所有朋友都会领取一块饼,但是要求的是所有人都要拿到大小相同的饼!题目要求输出的是:每个人尽量拿到的最大的饼的体积是多大。这里的饼的形状是高为1的圆柱形。V=底面积*高!
解题思路:求出每块饼的面积s[i],并记录面积最大的s[i]为maxs,然后在0~maxs之间进行二分得到mid,判断是否每个人都能得到面积为mid的饼,如果能则mid=left,否则right=mid!
代码如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<cmath>
#include<iomanip>
#define INF 99999999
using namespace std;
const int MAX=10000+10;
const double PT=3.14159265358979323846;
double s[MAX];
int t,n,m;
bool search(double v){
int sum=0;
for(int i=0;i<n;++i){
sum+=(int)(s[i]/v);
}
if(sum>=m)return true;
else return false;
}
int main(){
cin>>t;
while(t--){
cin>>n>>m;
++m;
double maxs=-INF,mins=0,mid=0;
for(int i=0;i<n;++i){
cin>>s[i];
s[i]=PT*s[i]*s[i];
maxs=max(maxs,s[i]*1.0);
}
while(fabs(mins-maxs)>1e-6){
mid=(mins+maxs)/2;
if(search(mid))mins=mid;
else maxs=mid;
}
cout<<fixed<<setprecision(4)<<mid<<endl;
}
return 0;
}