LA 3635 Pie
题目大意:有F+1个人来分N个圆形派,每个人得到的必须是一整块派,而不是几块拼在一起,且面积要相同。求出每个人最多能得到多大面积的派(不必是圆形)
其实就是分吃的^ ^,要均分.
二分查找的应用。
找一个派最大的面积maxa,那么能得到的就是在0~maxa。
然后不断的取中间的面积mid进行判断是否满足要求就可以了。
怎么判断呢?
看它是否满足每个派分成面积为mid的小派是否能满足F+1个人。(这句有点绕口令的感觉T T吐槽:干嘛叫派啊。我还蛋黄派呢,好吧,看不懂的把它替换为蛋黄派^ ^)
每个蛋黄派最多能分成 π*r*r/mid个。
就是这样啦~
值得注意的是π的精度。
3.141592654被秒杀。但PI=3.1415926535898;就过了。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const double PI=3.1415926535898;//书上是 PI=acos(-1.0);受教了 const int MAXN=10000+10; double area[MAXN]; int main() { int T,n,f,r; scanf("%d",&T); while(T--) { double maxa=0; scanf("%d%d",&n,&f); for(int i=0;i<n;i++) { scanf("%d",&r); area[i]=r*r*PI; maxa=max(maxa,area[i]); } double mid=maxa/2,upper=maxa,lower=0,ans=mid; while(upper-lower>1e-5) { int sum=0; for(int i=0;i<n;i++) sum+=floor(area[i]/mid);//也可以直接sum+=area[i]/mid; 但是看编译器警告好不爽T T if(sum>=f+1) { lower=mid; ans=mid; } else upper=mid; mid=(upper+lower)/2; } printf("%.4lf\n",ans); } }
新 blog : www.hrwhisper.me