比较奇葩的二分:
【题意】N块派(F+1)个分,每块派的半径为r1~rn,分派条件是每个人必须相等并且派是一块的(可由一块分出,但不能两块拼凑)。求没人分得的派的最大面积。
用n块面积的总和除以F+1得最大每人可能分得的派max,于是从0到max二分,条件是分出的整派要大于或等于F+1
二分结束的条件是精度满足题目取4位精度的要求
#include <iostream>
#include <cmath>
using namespace std;
#define N 10050
#define PI (double)acos(-1.0)
int a[N];
int main()
{
int t,n,f;
double ave;
cin >> t;
while(t--)
{
cin >> n >> f;
f += 1;//自己也要一块蛋糕
ave = 0.0;
for(int i=0; i<n; i++)
{
cin >> a[i];
a[i] = a[i]*a[i];
ave += a[i];
}
ave /= f;
double l = 0.0, r = ave;
double mid;
while(fabs(l-r)>0.000001)
{
mid = (l+r)/2;
int sum = 0;
for(int i=0; i<n; i++)
{
sum += (int)(a[i]/mid);
}
if(sum<f)
{
r = mid;
}
else
{
l = mid;
}
}
printf("%.4lf\n",mid*PI);
}
return 0;
}