1.简单题意
有f+1个人分n块披萨,每个人要求分得的面积一样,且披萨只能被切开而不能重新组合,求每个人能分到的最大面积v
2.解题思路
对于每个确定的v,可以计算出最多能满足的人数p。因此得到一个单调递减的函数关系,并且v的范围也可以确定为0~max(size(i)),i=1...n。
3.AC代码
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include<iostream>
using namespace std;
const double pi = acos(-1.0);
double a[10005];
int n, m;
int check(double mid)
{
int i;
int sum = 0;
for (i = 0; i<n; i++)
{
sum += int(a[i] / mid);
if (sum >= m)
return 1;
}
return 0;
}
int cmp(double a, double b)
{
return a>b;
}
int main()
{
int t, i;
double l, r, mid;
cin>>t;
while (t--)
{
cin >> n >> m;
m++;
for (i = 0; i<n; i++)
{
cin >> a[i];
a[i] = a[i] * a[i] * pi;
}
sort(a, a + n, cmp);
l = 0;
r = a[0];
if (m<n)
n = m;
while (r - l>1e-5)
{
mid = (r + l) / 2;
if (check(mid))
l = mid;
else
r = mid;
}
printf("%.4lf\n", l);
}
return 0;
}