POJ 3122 分饼

来源:互联网 发布:ubuntu deb 安装 依赖 编辑:程序博客网 时间:2024/04/30 00:25

问题描述:n 个大小不等的圆形饼,分给m 个人。要求每个人分得的大小相等,每个人只能有一块。那么最大的分隔方案是什么? 

解题的方案就是二分查找的思想。 最大的可行分隔大小就在[0,  最大的饼的大小]之中。

如何判断选定的分割方案是否合适:就是以该方案进行分割,看其是否能够满足m 个人的需求。

问题链接 点击打开链接

#include<iostream>#include<cmath>using namespace std;static double s[10000];static int n, f;double search(double max){double l, r, m;int i, count;l = 0.0;r = max;     while (l < r && (r -l) >= 10e-6){m = (l + r) / 2;for (count = 0, i = 0; i < n; i++){count += floor(s[i] / m);}if (count >= f + 1)l = m;elser = m;}return m;}int main(){int t;const double pi = acos(-1.0);cin >> t;while (t-- > 0){cin >> n >> f;int i, r;double maxarea;for (maxarea = -1.0, i = 0; i < n; i++){cin >> r;s[i] =  pi * r * r;if (s[i] > maxarea)maxarea = s[i];}printf("%.4lf\n", search(maxarea));}return 0;}

浮点数的精度问题需要注意。

原创粉丝点击