传送门UVa Live Archive 3635 & POJ 3122 - Pie
题意:每人一份苹果派,求让每人都分到的最大的体积。每人只能拿一块。
二分吧少年,思路挺简单,不多说了。
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 10000 + 100;
const double eps = 1e-6;
const double pai = acos(-1.0);
int pie[MAXN], num, n;
double sum;
bool isOK(double target)
{
int cnt = 0;
if (target * num > sum)
return false;
for (int i = 0; i < n; i++)
cnt += pie[i] / target;
if (cnt >= num)
return true;
return false;
}
int main()
{
//freopen("input.txt", "r", stdin);
int T, i, j, maxS;
scanf("%d", &T);
while (T--)
{
sum = 0;
maxS = -1;
scanf("%d%d", &n, &num);
num++;
for (i = 0; i < n; i++)
{
scanf("%d", &pie[i]);
pie[i] *= pie[i];
sum += pie[i];
maxS = max(maxS, pie[i]);
}
double left = 0, right = maxS, mid;
while (fabs(right - left) > eps)
{
mid = left + (right - left) / 2;
if (isOK(mid))
left = mid;
else
right = mid;
}
printf("%.4f\n", left * pai);
}
return 0;
}