问题描述: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;
else
r = 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;
}
浮点数的精度问题需要注意。