题目即为分饼,但是每个人要分到一样大,切只能是一整块,不能拼凑在一起,求每人分到最大的体积。。。。安神说我没真正理解二分搜索,确实,二分真的很神通广大,在这个题目我就死脑筋没转过弯,。。由于给的饼的数目和类型不确定。。。有些饼是可以舍弃的。。在这个处理上,用f>=V[I]/MID作为二分的条件最好了,即判断能不能切出这么多块MID体积大的饼出来。。。。其实这就是二分的思想,不要死脑筋。。二分可以变换很多形式,控制条件不同,达到不同的效果。。。这才是要去领会二分的精髓。
话说代码又是参考某位大神的。
#include <iostream> #include <cstdio> #include <cmath> using namespace std; double pi=acos(-1.0); int n,f,r; double v[11000],value=0.0; bool test(double x) { int sum=0; for (int k=0;k<n;k++) {sum+=(int)(v[k]/x);} if (sum<f+1) return false; else return true; } int main() { int t; cin>>t; while (t--) { cin>>n>>f; for (int i=0;i<n;i++) { cin>>r; v[i]=r*r*pi; value+=v[i]; } double uu=value/(f+1); double le=0.0,ri=uu,mid; while((ri-le)>1e-6) { mid=(ri-le)/2+le; if (test(mid)) le=mid; else ri=mid; } printf("%.4f\n",mid); } return 0; }