二分
本题要求,对n块Pie,分给f+1个人,每个人只能分一个整块,可以是整张Pie,要求每个人分的面积大小相同,求每人能分的最大面积。
用二分,对每一个待定面积M,将每张Pie分成面积整数份M面积的块,小于M的舍去,如果最终分的块>=f+1,则分成功。
本题还有一个精度要求,对于精度要求的把握两个原则
1)能用整形算无误差的用整形算
2)浮点型的数,精确到能精确的最小位。
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int MAX = 10000+5,MAX_A = 1000*1000,MIN_A = 0;
const double Pi = acos(-1.0);
int f,n;
double min_a,max_a;
double a[MAX];
void caculate()
{
double mid;
int sum;
while(max_a - min_a > 1e-5)
{
sum = 0;
mid = (min_a + max_a)/2;
for(int i = 0; i < n; i++)
{
sum += floor(a[i] / mid);
}
if(sum >= f + 1)min_a = mid;
else max_a = mid;
}
printf("%.4lf\n", min_a);
}
int main(int argc, char *argv[])
{
int kase;
scanf("%d",&kase);
while(kase--)
{
min_a = 0;
max_a = MIN_A;
scanf("%d%d",&n,&f);
for(int i = 0; i < n; i++)
{
scanf("%lf",a + i);
a[i] *= a[i]*Pi;
max_a = max(max_a,a[i]);
}
caculate();
}
//system("PAUSE");
return EXIT_SUCCESS;
}