题目大意:你和你的f个朋友分蛋糕(也就是一共f+1个人),有n个蛋糕,要求每个人分到的一样多,并且蛋糕不能拼接。可以有剩余。求每个人最大能分到的面积是多大。给定n个蛋糕的半径。
解题思路:直接二分即可,答案一定在0和最大的蛋糕面积之间。我们测试x是否可以,我们只需检测可以切下多少个x面积的蛋糕,只要够f+1块即可。本题与白书割绳子例题一样。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <vector>
#include <string>
#define mem(s) memset(s, 0, sizeof(s))
using namespace std;
const double PI = acos(-1.0);
double s[10005];
int n, f;
bool cheek(double x)
{
int sum = 0;
for(int i=0; i<n; i++) sum += floor(s[i] / x);//floor函数返回一个不大于这个数的整数,也就是取整函数
return sum >= f;
}
int main()
{
int t;
double r;
scanf("%d", &t);
while(t--)
{
double max_s = 0;
scanf("%d%d", &n, &f);
f++;
for(int i=0; i<n; i++)
{
scanf("%lf", &r);
s[i] = PI * r * r;
if(max_s < s[i]) max_s = s[i];
}
double L = 0, R = max_s;
while(R - L > 1e-5)
{
double mid = (L+R)/2;
if(cheek(mid)) L = mid;
else R = mid;
}
printf("%.4f\n", L);
}
return 0;
}