POJ 3122 Pie【二分答案】
<题目链接>
题目大意:
将n个半径不一但是高度为1的蛋糕分给 F+1个人,每个人分得蛋糕的体积应当相同,并且需要注意的是,每个人分得的整块蛋糕都只能从一个蛋糕上切下来,而不是从几个蛋糕上东拼西凑而成。现在问每人分得蛋糕的体积是多少。
解题分析:
就是普通的二分答案,但是要注意一下浮点型二分的结构,与整型二分略有不同。
#include <cstdio> #include <cmath> #include <algorithm> using namespace std; const double PI=acos(-1.0); int n,m,arr[10010]; const double eps=1e-6; bool juge(double x){ int sum=0; for(int i=1;i<=n;i++){ sum+=(int)(arr[i]/x); //当每个人得到x体积蛋糕时,最多能够分给几个人 } return sum>=(m+1); } int main(){ int T;scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); int maxv=-0x3f; for(int i=1;i<=n;i++){ scanf("%d",&arr[i]); arr[i]*=arr[i]; //先只进行半径的平方,不乘上pi,防止损失精度 maxv=max(maxv,arr[i]); } double l=0,r=maxv*1.0; while(r-l>eps){ double mid=(l+r)/2; if(juge(mid))l=mid; else r=mid; } printf("%.4lf\n",l*PI); } return 0; }
2018-09-20
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。