poj3122 pie

时间:2022-06-18 17:12:30

方法:二分。

题目意思:要过生日了,我请大家吃pie,然后人数一共是f+1(我自己)。每个人的pie不能是拼接的,而且每个人的面积是一样的,这样就用二分枚举。

范围是0~最大的那块pie。

然后用每一块去除枚举值,加到cnt上,当cnt>=f+1时候找大一点的面积, 否则找小一点的面积

pie的值要取得精确一点 , = =

另外在输出时候要是%f,如果用%lf会WA的。

上代码!

 #include <stdio.h>
#include <math.h>
#define pie 3.1415926535897932384626433
double Pies[+];
int n,f;
double find(double mmax){
int cnt;
int i;
double left=;
double right=mmax;
double mid;
double res=;
while(right-left>0.00001){
mid=(right+left)/;
cnt=;
for(i=;i<n;++i){
cnt+= (int)(Pies[i]/(mid));
}
if(cnt>=f){
left=mid;
if(mid>res)
res=mid;
}
else right=mid;
}
return mid;
} int main(){
int i,j;
int Case;
double mmax;
double res;
while(~scanf("%d",&Case)){
while(Case--){
scanf("%d%d",&n,&f);
f++;
mmax=-;
for(i=;i<n;++i){
scanf("%lf",&Pies[i]);
Pies[i]=pie*Pies[i]*Pies[i];
if(Pies[i]>mmax) mmax=Pies[i];
}
res=find(mmax);
printf("%.4f\n",res);
}
}
return ;
}